我只需要构建两个在不同端口上运行的守护进程实例。假设它们都为某些应用程序执行关键任务。
当其中一个守护进程无法运行的时候,我该如何执行一些自动任务(例如,shell脚本)来检查两个守护进程?
什么样的脚本可以始终检查守护进程的生命,并且如果其中一个守护进程偶然停止,可以执行一些其他作业?
答案1
monit
在这种情况下非常棒 - 它在本地主机上运行,因此您不需要网络连接即可重新启动守护进程(以防它失败,或者守护进程负责联网)。它在系统上占用的空间也很小,您还可以使用它来监视其他守护进程/磁盘空间/等等。
创建一个启动/停止脚本(类似于中的脚本)/etc/init.d/
并在系统用于正常运行的运行级别中为其创建符号链接,以确保守护进程将在重启时启动并在关机时正确停止。如果您的守护进程没有 pidfile,请使用脚本创建一个start-stop-daemon
。
之后,安装monit
并创建守护进程的配置,如下所示:
使用 pidfile /var/run/daemond.pid 检查进程守护进程 启动程序“/etc/init.d/daemond start” 停止程序“/etc/init.d/daemond stop” 如果失败,请在 10 个周期内键入 5 次 TCP 端口 1234,然后重新启动 如果 5 个周期内重启 3 次,则发出警报
此配置将确保如果守护进程在 tcp 端口 1234 上停止响应或停止运行,它将使用 init 脚本重新启动。monit
还将通过电子邮件向您发送警报,或执行其他操作,具体取决于您的配置方式。只需查看monit(1)
手册页即可。
答案2
我的建议是使用您(希望)现有的监控基础设施。
我使用 Nagios,并使用 SNMP 查询我的 Linux 机器。Linux MIB 允许我检索所有正在运行的进程的名称以及 PID 和参数。我使用它来监视未打开端口的各种守护进程(如 crond)。
答案3
很大程度上依赖于守护进程。
如果守护进程具有 API,并且您可以通过 TCP/IP 套接字或 UNIX 套接字与其通信,那么您可以这样做。
例如,如果它监听 TCP/IP 端口,您可以编写一个连接到该端口的脚本,等待某个响应 - 以及计算获取该响应所需的时间 - 您可以将其提供给 nagios、munin 或其他监控工具 - 无论您最终编写了什么脚本来执行单个检查,您都可以轻松地集成到 nagios 插件中 - 这可能就是您想要做的 - 一旦您编写了检查脚本。
如果它没有提供任何有用的信息,没有在端口上监听,你真正能做的就是使用 lsof、netstat 或类似的东西检查进程树,并确保它存在,但你实际上无法进行健康检查。
你需要更加具体地说明,然后这里的任何人才能为你提供有用的信息。
查看正在运行的守护进程的 PID,然后查看下面的内容/proc/<PID>/fd
以了解守护进程正在与哪些管道/套接字/文件交互 - 这可能有助于您入门。
答案4
也许您可以尝试使用 init 守护进程启动任务(假设这是 Unix,其他答案似乎已经这样做了)。查看 inittab 的手册页,其中应该详细说明如何执行此操作。您可以安排您的进程在启动时启动,或者在特定的运行级别启动。
如果您使用 respawn 选项,则您的进程在失败时将自动重新启动 - 即 init 守护进程是内置的进程监视器以及进程启动器。但是,init 守护进程还具有一些“智能”,例如,如果您的守护进程在太短的时间内重新启动太频繁,则最终 init 将在几分钟内停止尝试重新启动它。这使得恶意进程更难意外消耗机器上的所有 CPU。
init 通常也会被配置为将条目记录到 /var/log 的某个地方,这样您就可以免费获得日志记录。