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