Simone Carletti Asked: 2009-07-26 13:20:29 +0800 CST2009-07-26 13:20:29 +0800 CST 2009-07-26 13:20:29 +0800 CST 如何在服务器重启/进程退出时自动重启进程? 772 在我的 Ubuntu 服务器上,我使用God来监控一些 Ruby 进程/脚本,包括一个队列系统。 当我的一个进程存在并重新启动它时,上帝会自动检查。它还跟踪内存使用情况,并在触发特定条件时正确运行。今天我重新启动了服务器,过了一会儿我注意到我的队列不起作用。经过快速检查,我发现在服务器重启后上帝没有重启(我想应该如此)。 确保上帝(或通用进程)在服务器重新启动或进程因任何原因被终止时自动重新启动的最佳方法是什么? 我用来启动上帝的具体命令是 god -c config linux ubuntu process daemon 4 个回答 Voted Best Answer David Spillett 2009-07-26T13:34:18+08:002009-07-26T13:34:18+08:00 这里有几个选项。如果您想要一个推荐而不是阅读其他推荐,请跳到最后一段! 只需在重新启动时重新启动很容易:将其添加到/etc/rc.local默认情况下在其他启动脚本中的所有内容之后运行的基于 Debian 的发行版(以及许多其他发行版)。如果god不进入后台本身,您可能需要将 & 加入到命令的 ned 中,如下所示: god -c config & 上面的过程在被杀死时不会重新启动。你可以编写一个无限循环的脚本,但这很麻烦,当你真的想要它被杀死时会导致问题。 您还可以创建自己的初始化脚本,以/etc/init.d( 并链接到/etc/rc.*' 中的脚本为模型,这将为您提供更完整的解决方案,因为您可以在需要时停止/启动服务,但这不会自动启动服务为您服务,无需您编写额外的脚本。 您可以将其添加到您的/etc/inittab.,然后init将为您管理该过程,在启动时启动它并在它死亡时重新启动它。如果它在很短的时间内经常死机,它甚至会停止重新启动它。这仍然不完美。 我认为您所描述的一般推荐的方法是daemontools(http://en.wikipedia.org/wiki/Daemontools),它还支持在服务死亡时重新启动服务。这比使用条目要多一些工作,/etc/initab但您最终会得到一个更清洁的最终产品,它应该可以完成您在问题中提出的所有问题。daemontools应该可以在几乎任何 Linux 发行版的存储库中找到。 James 2009-07-26T13:44:43+08:002009-07-26T13:44:43+08:00 如果您要确保进程始终运行,那么 inittab 是明智的做法,因为如果进程死亡,它将重新启动进程。但是我不会这样做,就好像它失败了我宁愿早点而不是晚点发现这一点,因为我的代码会改进并且我不太可能使机器不稳定。 如果您具有 root 访问权限,则在 /etc/init.d 中创建一个初始化脚本,然后使用 update-rc.d 在运行级别目录中创建正确的符号链接。一个示例脚本看起来像 #!/bin/bash ### BEGIN INIT INFO # Provides: god # Required-Start: $syslog # Required-Stop: $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Runs the ruby god meta server. # Description: Runs the ruby god meta server. ### END INIT INFO start_daemon () { nohup start-stop-daemon --start --quiet -m --pidfile /var/run/god.pid \ --exec god -- -c config RETVAL=$? } stop_daemon () { start-stop-daemon --stop --quiet --oknodo -m --pidfile /var/run/god.pid RETVAL=$? } case "$1" in start) start_daemon ;; stop) stop_daemon ;; restart | reload | force-reload ) stop_daemon start_daemon ;; esac 如果您只是普通用户,那么您可以使用 cron 在启动时运行进程,方法是将启动时间指定为@reboot @reboot god -c config David Pashley 2009-07-26T13:28:28+08:002009-07-26T13:28:28+08:00 您需要为它编写一个 init.d 脚本来启动和停止上帝。您可以使用 /etc/init.d 下的任何脚本作为示例。调用你的新脚本 /etc/init.d/god。然后你可以运行 # update-rc.d god defaults 它应该确保它在服务器启动和关闭时启动和停止。您可能会发现互联网上已经有一个用于上帝的 init.d 脚本。在你坐下来写之前我会快速搜索一下。 Cian 2009-07-26T13:31:26+08:002009-07-26T13:31:26+08:00 为了确保上帝在启动时重新启动它,您需要将其添加到 init 脚本中。为此,请编写一个至少接受 start 作为参数的脚本(要遵循标准,您必须做的不仅仅是那)并将其粘贴在 /etc/init.d/ 中。然后将一个名为 S99 的符号链接添加到 /etc/rc[无论您希望脚本从什么运行级别开始]。 理想情况下,为了更好地遵循标准,将 /etc/init.d/skeleton 复制到 /etc/init.d/ 中的其他位置并对其进行编辑以适应。
这里有几个选项。如果您想要一个推荐而不是阅读其他推荐,请跳到最后一段!
只需在重新启动时重新启动很容易:将其添加到
/etc/rc.local
默认情况下在其他启动脚本中的所有内容之后运行的基于 Debian 的发行版(以及许多其他发行版)。如果god
不进入后台本身,您可能需要将 & 加入到命令的 ned 中,如下所示:上面的过程在被杀死时不会重新启动。你可以编写一个无限循环的脚本,但这很麻烦,当你真的想要它被杀死时会导致问题。
您还可以创建自己的初始化脚本,以
/etc/init.d
( 并链接到/etc/rc.*
' 中的脚本为模型,这将为您提供更完整的解决方案,因为您可以在需要时停止/启动服务,但这不会自动启动服务为您服务,无需您编写额外的脚本。您可以将其添加到您的
/etc/inittab
.,然后init
将为您管理该过程,在启动时启动它并在它死亡时重新启动它。如果它在很短的时间内经常死机,它甚至会停止重新启动它。这仍然不完美。我认为您所描述的一般推荐的方法是
daemontools
(http://en.wikipedia.org/wiki/Daemontools),它还支持在服务死亡时重新启动服务。这比使用条目要多一些工作,/etc/initab
但您最终会得到一个更清洁的最终产品,它应该可以完成您在问题中提出的所有问题。daemontools
应该可以在几乎任何 Linux 发行版的存储库中找到。如果您要确保进程始终运行,那么 inittab 是明智的做法,因为如果进程死亡,它将重新启动进程。但是我不会这样做,就好像它失败了我宁愿早点而不是晚点发现这一点,因为我的代码会改进并且我不太可能使机器不稳定。
如果您具有 root 访问权限,则在 /etc/init.d 中创建一个初始化脚本,然后使用 update-rc.d 在运行级别目录中创建正确的符号链接。一个示例脚本看起来像
如果您只是普通用户,那么您可以使用 cron 在启动时运行进程,方法是将启动时间指定为
@reboot
您需要为它编写一个 init.d 脚本来启动和停止上帝。您可以使用 /etc/init.d 下的任何脚本作为示例。调用你的新脚本 /etc/init.d/god。然后你可以运行
它应该确保它在服务器启动和关闭时启动和停止。您可能会发现互联网上已经有一个用于上帝的 init.d 脚本。在你坐下来写之前我会快速搜索一下。
为了确保上帝在启动时重新启动它,您需要将其添加到 init 脚本中。为此,请编写一个至少接受 start 作为参数的脚本(要遵循标准,您必须做的不仅仅是那)并将其粘贴在 /etc/init.d/ 中。然后将一个名为 S99 的符号链接添加到 /etc/rc[无论您希望脚本从什么运行级别开始]。
理想情况下,为了更好地遵循标准,将 /etc/init.d/skeleton 复制到 /etc/init.d/ 中的其他位置并对其进行编辑以适应。