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


10

我需要监视Web服务器上运行的多个进程。由于某种原因,清漆目前每天或每两天崩溃一次。我正在使用monit自动重新启动清漆,但是它不起作用。这是我的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

日志文件显示,清漆停止运行后,尝试重新启动之后全部失败。然后最终monit停止监视清漆。

有人对我如何解决此问题有建议吗?还是更好,您能建议其他自动监视和重新启动崩溃进程的简单方法吗?谢谢!


我不敢相信这样的事情在预先系统的时代有多困难。
Fl0v0

Answers:


17

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

专门为此目的而构建的Supervise是为了启动进程并对其进行监视,如果进程终止则立即重新启动。

如果您需要执行比简单的“它是否仍在运行”检查更复杂的操作,并且如果需要重新启动该过程,则可以通过monit进行监视。


我也使用daemontools来监视不稳定的服务进程。如果我不得不说,很方便。:-)
edomaur's


2

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

如果varnish需要root权限才能启动(通常使用init.d脚本执行),请将“ /etc/init.d/varnish start”更改为“ sudo /etc/init.d/varnish start”。但这可能还不够,因为您可能不想给运行的任何用户监视权限,因为所有命令都具有sudo nopasswd的总特权,而将sudo赋给Shell脚本基本上也一样。因此,您将需要确定该init脚本中的哪些命令需要sudo,将这些命令在/ etc / sudoers文件中的sudo特权赋予monit用户,并最终相应地编辑该init脚本。或者,不是所有这些清漆,而是可以非root用户身份运行?

最后,我确定您知道这一点,但无论如何我都会说出来。您显然为此付出了很多努力,我希望您付出同样的努力来弄清楚为什么清漆会崩溃并真正修复它(或促使开发人员找出原因):-)

更新:
这可能不那么干净,但是以root身份完成此操作的一种简单方法可能是设置一个脚本,以检查该过程是否正常,如果不正常,则将其启动。然后,只需每两分钟运行一次该脚本即可完成cron工作。


起初我考虑过Nagios,但出于我的目的想要一些小巧而简单的东西。是的,我正在研究清漆问题。我的一台服务器已经稳定运行了很长时间,所以这肯定与我有关。:(
林先生2009年

1

从StackOverflow提取的另一种很棒的方法:

until myserver; do
    echo "Server 'myserver' crashed with exit code $?.  Respawning.." >&2
    sleep 1
done

可以将其添加到crontab中:

crontab -e

然后添加一条规则以启动监视脚本:

@reboot /usr/local/bin/myservermonitor

或作为脚本添加到 /etc/init.d

有关为什么这是一种好方法的详细说明,请参见StackOverflow答案


0

我也在寻找最简单的方法来解决这个问题。我能找到的最简单的方法是在标记的最后一行中简单地添加Restart=allways到相关.service文件中。/etc/systemd/system/multi-user.target.wants/[service]

那些经过sudo systemctl daemon-reload,然后sudo systemctl restart service.service重新加载的变化。

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

它应该工作在:

  • Debian 7和Debian 8
  • Ubuntu 15.04及更高版本
  • CentOS 7和Futured
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.