Linux:编写监视程序以监视多个进程


14

几年前,一位同事提出了一种看门狗程序的优雅解决方案。该程序在Windows上运行,并使用Windows Event对象监视多个应用程序的进程句柄(PID)。如果任何一个进程意外终止,则其进程句柄将不再存在,并且将立即向其看门狗发出信号。然后,看门狗将采取适当的措施来“修复”系统。

我的问题是,您将如何在Linux上实现这种看门狗?单个程序是否可以监视其他许多程序的PID?


另请参阅确保进程始终在运行以获取监视/监督程序的列表。
吉尔(Gilles)“所以,别再邪恶了”,

Answers:


17

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

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

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

有许多进程监视(也称为管理程序)程序,它们可以报告进程何时终止并有选择地重新启动它,此外还包括:MonitSuperviseUpstart等。


+1,正是我要的内容-感谢您提供如此详细的答案。
贾斯汀·埃斯蒂尔

0

解决此问题的方法是使用init及其内置的respawn指令启动/重新启动您需要运行的任何程序。这是其最初的意图和主要目的。在某些情况下,您将需要运行脚本以在进程终止后进行清理,或者为启动进程做准备(大多数情况下,工作是相同的)。在大多数情况下,以exec结尾的bash脚本对此非常有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.