Linux:编写看门狗来监控多个进程

Jus*_*ier 14 linux process monitoring

几年前,一位同事为看门狗程序提出了一个优雅的解决方案。该程序在 Windows 上运行并使用Windows 事件对象来监视多个应用程序的进程句柄 (PID)。如果任何一个进程意外终止,它的进程句柄将不再存在,并且他的看门狗将立即收到信号。然后看门狗会采取适当的行动来“治愈”系统。

我的问题是,您将如何在 Linux 上实现这样的看门狗?有没有办法让单个程序监视许多其他程序的 PID?

Gil*_*il' 17

传统的、可移植的、常用的方式是父进程监视它的子进程。

基本原语是waitwaitpid系统调用。当子进程死亡时,父进程会收到一个SIGCHLD信号,告诉它应该调用wait以了解哪个子进程死亡及其退出状态。父进程可以选择忽略SIGCHLDwaitpid(-1, &status, WNOHANG)在方便时调用。

要监视多个进程,您可以从同一个父进程中生成它们,或者通过一个简单的监视进程调用它们,该进程只调用所需的程序,等待它终止并报告终止(在 shell 语法中:)myprogram; echo myprogram $? >>/var/run/monitor-collector-pipe。如果您来自 Windows 世界,请注意让小程序执行一项专门任务是 Unix 世界中的常见设计,操作系统旨在使进程便宜。

有许多进程监控(也称为主管)程序可以报告进程何时死亡并可选择重新启动它,此外还有更多:MonitSuperviseUpstart ……