0

我有两个在 linux 中运行的服务,分别调用它们AB. 每个都依赖于另一个,因此如果一个崩溃并重新启动,另一个必须立即重新启动。

我写了一个监控程序,分别启动和监控这两个服务,程序崩溃时可以重启一个服务。

我想改进监控程序,以便当它发现一个服务崩溃时,它会获取另一个服务的 PID 并杀死它。

4

2 回答 2

1

有一些很棒的解决方案可以让您对不同事件的特定响应进行编程。

daemontools - http://cr.yp.to/daemontools.html

新贵(如果你使用 ubuntu)- http://upstart.ubuntu.com/

主管 - http://supervisord.org/

于 2012-05-15T01:06:47.277 回答
1

监控进程将使用fork(2)生成两个孩子,对吗?如果是这样,父母将取回孩子的PID,它可以为每个孩子保存在一个变量中。

在生成两个进程之后,父监视器可以坐在一个循环中,等待waitpid(2)调用。使用正确的选项,此调用可以阻塞,直到其中一个子进程终止,然后您将返回子进程的 PID 及其退出状态。基于此,您可以对另一个孩子执行kill(2),然后重新执行分叉序列以生成两个孩子的新实例。

请注意,在杀死第二个孩子之后,您的下一个 waitpid 调用将返回那个的 PID,而不是新的一对孩子中的一个。因此,您需要对照当前孩子的 PID 检查返回的 PID 如果不匹配则忽略它。

于 2012-05-17T10:07:27.397 回答