重新启动崩溃进程的简单方法?

重新启动崩溃进程的简单方法?

我需要监控我的网络服务器上运行的几个进程。出于某种原因,Varnish 目前每隔一两天就会崩溃一次。我使用 monit 来自动重启 varnish,但它不起作用。这是我的 Varnish 的 monit.conf 条目。

check process varnish with pidfile /var/run/varnish.pid
    start program = "/etc/init.d/varnish start" with timeout 60 seconds
    stop program = "/etc/init.d/varnish stop"
    if failed host <my server ip> port 80 protocol http
        and request "/blank.html" then restart
    if 3 restarts within 5 cycles then timeout
    group server

日志文件显示,varnish停止运行后,随后尝试重新启动均失败。然后monit最终停止监控varnish。

有人能建议我如何解决这个问题吗?或者更好的是,你能建议其他简单的方法来自动监控和重启崩溃的进程吗?谢谢!

答案1

我会查看 daemontools (http://cr.yp.to/daemontools.html)。

Supervise 正是为此目的而构建的 —— 启动进程并监视它们,如果它们终止则立即重新启动它们。

如果您需要执行比简单的“它是否仍在运行”检查更复杂的事情,您仍然可以使用 monit,如果需要重新启动该过程,则可以通过 supervise 来执行。

答案2

您还可以使用/etc/inittab使用以下方法重新启动死进程重生行动。

参见 inittab 部分http://aplawrence.com/Unixart/startup.html

答案3

您可以使用Nagios 事件处理程序脚本如果您已准备好重新启动服务。

如果 varnish 需要 root 权限才能启动(init.d 脚本通常需要),请将“/etc/init.d/varnish start”更改为“sudo /etc/init.d/varnish start”。但这可能还不够,因为您可能不想授予 monit 运行的任何用户所有命令的 sudo nopasswd 权限,而授予 shell 脚本 sudo 权限基本上同样糟糕。因此,您需要找出该 init 脚本中的哪些命令需要 sudo,在 /etc/sudoers 文件中将这些命令的 sudo 权限授予 monit 用户,最后相应地编辑该 init 脚本。或者也许 varnish 可以以非 root 用户身份运行?

最后,我相信你知道这一点,但我还是要说。你显然为此付出了很多努力,我希望你也能付出同样的努力来找出 Varnish 崩溃的原因并真正修复它(或催促开发人员找出原因) :-)

更新:
这可能不太干净,但以 root 身份完成此操作的一种简单方法可能是设置一个脚本来检查进程是否正常,如果不正确则启动它。然后每隔几分钟运行一次该脚本作为 cron 作业。

答案4

我也在寻找处理此问题的最简单方法。我能找到的最简单的方法就是将其添加Restart=always到相关文件的最后一行标签.service中。/etc/systemd/system/multi-user.target.wants/[service]

之后,执行sudo systemctl daemon-reloadsudo systemctl restart service.service重新加载更改。

您可以通过检查服务是否正在运行来进行测试: systemctl status processname,检查开始时间戳。之后,执行ps -ef | grep servicename,并终止刚刚找到的 id 的进程kill 1234。之后systemctl status processname再执行一次并检查开始时间戳是否已更新。

还要检查/var/log/daemon.log错误

它应该起作用:

  • Debian 7 和 Debian 8
  • Ubuntu 15.04 及更高版本
  • CentOS 7 及更高版本

相关内容