我只需构build两个运行在不同端口上的守护进程实例。 假设他们都为某些应用程序提供关键任务。
我怎么能做一些自动任务(如shell脚本)执行检查守护进程时,其中一个服务失败?
什么样的脚本可以随时检查守护进程的生活,并且如果其中一个守护进程偶然停止,可以执行一些其他的工作?
在这种情况下, monit
非常棒 – 它运行在本地主机上,所以你不需要networking连接来重启你的守护进程(万一失败,或者守护进程负责联网)。 它在系统上的占用空间也很小,你可以用它来监视你的其他守护进程/磁盘空间等等。 以及。
创build一个启动/停止脚本(类似于/etc/init.d/
的启动/停止脚本),并在系统运行的运行级别创build符号链接,确保守护进程将在重新启动时启动,并在正常closures时停止。如果守护进程没有pidfile,使用start-stop-daemon
脚本创build一个。
之后,安装monit
并为守护进程创buildconfiguration,如下所示:
用pidfile /var/run/daemond.pid检查进程daemond 启动程序“/etc/init.d/daemond start” 停止程序“/etc/init.d/daemond stop” 如果失败的端口1234在10个周期内inputTCP 5次,然后重新启动 如果3在5个周期内重新启动,然后警报
这个configuration将确保如果守护程序在TCP端口1234上停止响应,或者将停止运行,它将使用init脚本重新启动。 monit
还会通过电子邮件向您发送警报,或者执行其他操作,具体取决于您如何configuration它。 只要看看monit(1)
页。
我的build议是使用你的(希望)现有的监控基础设施。
我使用Nagios,并用SNMP查询我的Linux机器。 Linux MIB允许我检索所有正在运行的进程的名称,以及PID和参数。 我使用它来监视不打开端口的各种守护进程(如crond)。
取决于守护进程。
如果守护进程有一个API,并且可以通过TCP / IP套接字或UNIX套接字与守护进程通信,那么可以这样做。
例如,如果它侦听TCP / IP端口,则可以编写一个连接到它的脚本,期望得到一定的响应,并且还要花费多长时间才能得到响应 – 您可以将其提供给监视工具,如nagios, munin或其他 – 无论您最终编写什么脚本来执行单个检查,您都可以轻松地将其集成到nagios插件中 – 例如,您可能已经编写了检查脚本,这可能是您想要做的。
如果它没有提供任何用处,不会监听端口,所有你可以做的就是使用lsof,netstat或类似的东西来检查进程树,并确保它存在,但是你不能真正做到健康检查。
在这里任何人都可以为你提供有用的东西之前,你需要更加具体。
查看正在运行的守护进程的PID,然后查看/proc/<PID>/fd
以查看守护进程正在与哪些pipe道/套接字/文件进行交互 – 这可以帮助您开始。
那么,当它死亡时,我有一个最喜欢的检查,这是非常简单的。 只需用以下方法启动它:
/ path / to / daemon || mail [email protected]“/ path / to / daemon died; do X”或者:
而[[-z“”]]; do / path / to /守护进程|| mail [email protected]“/ path / to / daemon died; restarting”; DONE
或类似的东西。 如果守护进程在出现问题时会退出,这会给您非常简单可靠的监控。
也许你可以尝试使用init守护进程启动任务(假设这是Unix,其他答案似乎已经完成了)。 查看inittab的手册页面,应该详细说明如何做。 您可以安排您的stream程在启动时或在特定的运行级别启动。
如果你使用respawn选项,那么你的进程只会在失败的时候自动重启 – 也就是说init守护进程是一个内置的进程监视器和进程启动器。 然而,init守护进程也有一些“智能”,如果你的守护进程在太短的时间内重启,那么最终init会停止尝试再启动几分钟。 这使得stream氓进程意外地占用机器上的所有CPU更困难。
init通常会被configuration成将日志logging到/ var / log,这样你就可以免费login了。
不知道为什么没有人列出这个明显简单的解决scheme:
#!/bin/bash ps ax | grep "[p]rogie" >/dev/null 2>&1 if [ $? != 0 ] ; then # do something fi
我build议使用监视工具(如nagios)或其他海报推荐的自定义脚本来监视这类任务。
另一张海报包括Monit的configuration代码片段; 上帝在概念上是相似的,但用ruby书写。 这两个工具都是为处理这种情况而编写的,并且提供比定制脚本更大的灵活性(如果过程存在但是没有响应呢?如果你的grep匹配了一个你没有预料到的过程?),并提供“开箱即用”的阈值和滞后支持。
我可能会使用Nagios作为单独的警报和通知path,但我不会将其用作监视和重新启动进程的唯一方式,因为我不会使用手写脚本 – 它不提供足够的灵活性对于大多数的监控情况,虽然你可以触发事件(比如重启一个服务),但它没有像monit这样的工具的灵活性。