当其中一个守护进程死亡时执行某些操作的 Shell 脚本?

当其中一个守护进程死亡时执行某些操作的 Shell 脚本?

我只需要构建两个在不同端口上运行的守护进程实例。假设它们都为某些应用程序执行关键任务。

当其中一个守护进程无法运行的时候,我该如何执行一些自动任务(例如,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 的某个地方,这样您就可以免费获得日志记录。

相关内容