几年前,一位同事为看门狗程序提出了一个优雅的解决方案。该程序在Windows上运行并使用Windows 事件对象监视多个应用程序的进程句柄(PID)。如果任何一个进程意外终止,其进程句柄将不再存在,并且其看门狗将立即收到信号。然后,看门狗将采取适当的措施来“治愈”系统。
我的问题是,如何在 Linux 上实现这样的看门狗?有没有办法让一个程序监控许多其他程序的 PID?
答案1
传统的、可移植的、常用的方式是父进程监视其子进程。
基本原语是wait
和waitpid
系统调用。当子进程死亡时,父进程会收到一个SIGCHLD
信号,告诉它应该调用wait
以了解哪个子进程死亡及其退出状态。父进程可以选择忽略并在方便时SIGCHLD
调用。waitpid(-1, &status, WNOHANG)
要监视许多进程,您可以从同一个父进程中生成所有进程,或者通过一个简单的监视进程来调用它们,该进程仅调用所需的程序,等待其终止并报告终止情况(在 shell 语法中:)myprogram; echo myprogram $? >>/var/run/monitor-collector-pipe
。如果您来自 Windows 世界,请注意,让小程序执行一项专门任务是 Unix 世界中的常见设计,操作系统的设计目的是使进程变得便宜。
答案2
我解决这个问题的方法是使用 init 及其内置的 respawn 指令来启动/重新启动您需要运行的任何内容。这是其初衷和主要目的。在某些情况下,您需要在进程终止后运行脚本进行清理,或者准备进程启动(大多数情况下工作是相同的)。在大多数情况下,以 exec 结尾的 bash 脚本非常适合此目的。