在我的 Ubuntu 服务器上我使用上帝监控一些 Ruby 进程/脚本,包括队列系统。
God 会自动检查我的某个进程是否存在并重新启动它。它还会跟踪内存使用情况,并在触发特定条件时正确执行操作。今天我重新启动了服务器,过了一会儿,我发现我的队列无法正常工作。快速检查后,我发现服务器重新启动后 God 并没有重新启动(我认为应该重新启动)。
确保 God(或通用进程)在服务器重启时或进程因某种原因被终止时自动重新启动的最佳方法是什么?
我用来启动 God 的具体命令是
god -c config
答案1
这里有几个选项。如果您想要一个建议,请直接跳到最后一段,而不必阅读其他内容!
重启时重启很简单:将它添加到/etc/rc.local
基于 Debian 的发行版(和许多其他发行版)中,默认情况下在其他启动脚本中运行所有内容。如果god
没有进入后台,您可能需要将 & 添加到命令的末尾,如下所示:
god -c config &
但是上面的代码不会在进程被终止时重新启动进程。您可以编写一个无限循环的脚本,但这很麻烦,而且当您真的想终止它时会引发问题。
您还可以创建自己的初始化脚本,以 中的脚本为模型/etc/init.d
(并链接到/etc/rc.*
',这将为您提供更完整的解决方案,因为您可以在需要时停止/启动服务,尽管这不会自动为您启动服务而无需您编写一些额外的脚本。
您可以将其添加到您的/etc/inittab
,然后init
它将为您管理进程,在启动时启动它,并在它死机时重新启动它。如果它在短时间内死机太频繁,它甚至会停止重新启动它。但这仍然不完美。
我认为对于您所描述的情况,通常推荐的方法是daemontools
(http://en.wikipedia.org/wiki/Daemontools) 还支持在服务终止时重新启动服务。这比使用条目要多一些工作/etc/initab
,但最终您将获得更简洁的最终产品,该产品应该可以完成您在问题中提出的所有要求。daemontools
应该可以在几乎任何 Linux 发行版的存储库中找到。
答案2
如果要确保进程始终运行,则 inittab 是明智的做法,因为如果进程终止,它将重新启动进程。但是我不会这样做,因为如果它失败了,我宁愿尽早发现这一点,这样我的代码会得到改进,而且我不太可能让机器变得不稳定。
如果您具有 root 权限,则在 /etc/init.d 中创建一个 init 脚本,然后使用 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
答案3
您需要编写一个 init.d 脚本来启动和停止 god。您可以使用 /etc/init.d 下的任何脚本作为示例。将新脚本命名为 /etc/init.d/god。然后您可以运行
# update-rc.d god defaults
并且它应该确保在服务器启动和关闭时启动和停止。您可能会发现互联网上已经有一个 god 的 init.d 脚本。在您坐下来编写一个脚本之前,我会快速搜索一下。
答案4
为了确保 god 在启动时重新启动它,您需要将其添加到 init 脚本中。为此,编写一个至少接受 start 作为参数的脚本(为了遵循标准,您必须做更多的事情)并将其粘贴在 /etc/init.d/ 中。然后将一个名为 S99 的符号链接添加到 /etc/rc[您希望脚本从哪个运行级别启动]。
理想情况下,为了更好地遵循标准,将 /etc/init.d/skeleton 复制到 /etc/init.d/ 中的其他位置并进行编辑以适应。