在我的Ubuntu服务器上,我使用God来监视一些Ruby进程/脚本,包括一个Queue系统。
上帝会自动检查我的某个进程是否存在,然后重新启动它。 它还跟踪内存使用情况,并在特定条件触发时正常运行。 今天我重新启动服务器,过了一段时间,我发现我的队列不能工作。 经过快速检查,我发现服务器重启后神没有重新启动(我认为应该)。
确保上帝(或通用进程)的最佳方法是在服务器重新引导时自动重启,或者因为任何原因而终止进程?
我用来启动上帝的具体命令是
god -c config
这里有几个选项。 只要跳到最后一段,如果你想要一个build议,而不是阅读其他人!
重启后重启很简单:将其添加到/etc/rc.local ,默认情况下,基于Debian的发行版(以及许多其他版本)在其他启动脚本中的所有内容之后运行。 如果god不放弃背景本身,你可能需要像这样对命令进行处理:
god -c config &
上面的代码在被杀死的时候不会重启进程。 你可以写一个脚本无限循环,但是这是混乱的,并会导致问题,当你真的想杀死。
你也可以创build自己的初始化脚本,仿照/etc/init.d脚本(链接到/etc/rc.* ),这将给你一个更完整的解决scheme,因为你将有设施来停止/启动服务你需要,虽然这不会自动启动你的服务没有一些额外的脚本你的一部分。
你可以将它添加到你的/etc/inittab ,然后init会为你pipe理这个进程,在启动时启动它,如果它死了,重新启动它。 如果经常在很短的时间内死亡,它甚至会停止重新启动。 尽pipe如此,这还不够完美。
我认为你所描述的一般build议的方法是daemontools ( http://en.wikipedia.org/wiki/Daemontools ),它也支持重新启动服务。 这里比在/etc/initab使用一个入口要多一点工作,但是最终会有一个更清洁的最终产品,它应该在你的问题中提出你所要求的一切。 daemontools应该放在任何Linux发行版的仓库中。
如果你确保进程始终运行,那么inittab是明智的做法,因为如果它死了,将会重启进程。 但是我不会这样做,就好像它失败一样,我宁愿早点发现它,因为我的代码会改善,我不太可能使机器变得不稳定。
如果您拥有root权限,请在/etc/init.d中创build一个init脚本,然后使用update-rc.d在运行级别目录中创build正确的符号链接。 示例脚本看起来像
#!/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
你需要写一个init.d脚本来启动和停止上帝。 您可以使用/etc/init.d下的任何脚本作为示例。 调用你的新脚本/etc/init.d/god。 你可以运行
# update-rc.d god defaults
它应该确保它启动和停止在服务器启动和closures。 你可能会发现在互联网上已经有了一个init.d脚本。 在你坐下来写一个之前,我会快速search。
为了确保上帝在启动时重新启动它,你需要将它添加到init脚本中。为此,编写一个至less接受启动参数的脚本(遵循标准,你必须做的比),并坚持在/etc/init.d/。 然后添加一个名为S99的符号链接到/ etc / rc [无论你希望脚本启动的运行级别]。
理想情况下,要更好地遵循标准,请将/etc/init.d/skeleton复制到/etc/init.d/中的其他位置,然后对其进行编辑以适应。