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


我需要监视在我的网络服务器上运行的几个进程。出于某种原因,清漆目前每天或每两天崩溃一次。我正在使用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停止监控清漆。

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


10
2017-08-11 22:09






答案:


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

Supervise就是为了这个目的而构建的 - 启动进程并观察它们,如果它们终止则立即重新启动它们。

如果您需要执行比简单的“仍在运行”检查更复杂的事情,并且如果需要重新启动该过程,那么您仍然可以使用monit,然后通过监督来执行此操作。


17
2017-08-11 22:41



我也使用daemontools来监视不稳定的服务进程。如果我不得不说,非常方便。 :-) - edomaur
那非常有用。谢谢! - Lin


你也可以使用 / etc / inittab中 使用。重新启动死进程 重生 行动。

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


4
2017-08-12 16:20





您可以使用 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脚本。或者也许代替所有这些清漆可以作为非root用户运行?

最后,我相信你知道这一点,但无论如何我都会说。你显然已经付出了很多努力,我希望你付出尽可能多的努力来弄清楚为什么清漆崩溃并实际修复它(或者追捕开发人员以找出原因):-)

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


2
2017-08-12 00:42



我起初考虑过Nagios,但是为了我的目的想要一些小而简单的东西。是的,我正在调查清漆问题。我的一台服务器已经运行了很长时间,所以它肯定与我有关。 :( - Lin


另一个好方法 取自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回答 详细解释为什么这是一个好方法。


1
2017-11-05 22:51





我也在寻找解决这个问题的最简单方法。我能找到的最简单的方法就是简单地添加 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和未来

0
2017-12-19 13:34