我需要监视在我的网络服务器上运行的几个进程。出于某种原因,varnish 目前每天或两天崩溃一次。我正在使用 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
日志文件显示 varnish 停止运行后,之后尝试的重新启动都失败了。然后最终 monit 停止监视清漆。
有人对我如何解决这个问题有建议吗?或者更好的是,你能推荐其他简单的方法来自动监控和重启崩溃的进程吗?谢谢!
我会查看 daemontools ( http://cr.yp.to/daemontools.html )。
Supervise 正是为此目的而构建的——启动进程并监视它们,如果它们终止则立即重新启动它们。
如果您需要做比简单的“它是否仍在运行”检查更复杂的事情,您仍然可以使用 monit,并且如果需要重新启动进程,则通过监督来完成。
您还可以使用/etc/inittab使用respawn操作重新启动死进程。
请参阅http://aplawrence.com/Unixart/startup.html上的 inittab 部分
如果您已经准备好重新启动服务,则可以将事件处理程序脚本与 Nagios 一起使用。
如果 varnish 需要 root 权限才能启动(通常是 init.d 脚本)将“/etc/init.d/varnish start”更改为“sudo /etc/init.d/varnish start”。但这可能还不够,因为您可能不想将运行的任何用户 monit 作为对所有命令的总 sudo nopasswd 权限授予所有命令,并且将 sudo 授予 shell 脚本基本上同样糟糕。因此,您需要确定该 init 脚本中的哪些命令需要 sudo,将 /etc/sudoers 文件中的这些命令 sudo 权限授予 monit 用户,最后相应地编辑该 init 脚本。或者也许代替所有这些清漆可以作为非root用户运行?
最后,我相信你知道这一点,但我还是要说。您显然为此付出了很多努力,我希望您付出同样多的努力来找出清漆崩溃的原因并实际修复它(或者让开发人员找出原因):-)
更新:
这可能不那么干净,但是以 root 身份完成此操作的一种简单方法可能是设置一个脚本来检查进程是否正常,如果不正常则启动它。然后每隔几分钟运行一次该脚本作为 cron 作业。
另一个取自 StackOverflow的好方法:
这可以添加到 crontab 中:
然后添加一个规则来启动你的监控脚本:
或作为脚本添加到
/etc/init.d
有关为什么这是一种好方法的详细说明,请参阅StackOverflow 答案。
我也在寻找最简单的方法来处理这个问题。我能找到的最简单的方法是简单地将
Restart=always
相关.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
再次执行并检查开始时间戳是否已更新。同时检查
/var/log/daemon.log
错误它应该适用于:
似乎没有人问过的一件事......
(我从未使用过它。这可能是它的“正常”行为,但不知何故我怀疑它......)
当然,您可以花很长时间想出让汽车自动重新启动的“聪明”方法,但肯定最好不要一开始就把它撞到墙上?