我在linux中运行了两个服务,称之为A
和B
。每个都依赖于另一个,所以如果一个崩溃并重新启动,另一个必须立即重新启动。
我已经编写了一个监控程序来分别启动和监控这两个服务,程序可以在崩溃时重启一个服务。
我想改进监控程序,以便当它发现一个服务崩溃时,它将获得另一个服务的PID并将其终止。
答案 0 :(得分:1)
有一些很棒的解决方案可以为不同的事件编制特定的响应。
daemontools - http://cr.yp.to/daemontools.html
upstart(如果你使用ubuntu) - http://upstart.ubuntu.com/
答案 1 :(得分:1)
监控进程将使用fork(2)生成两个孩子,对吧?如果是这样,父母将返回子PID,它可以保存在每个孩子的变量中。
产生两个进程后,父监视器可以坐在一个循环中,等待waitpid(2)调用。使用正确的选项,此调用可以阻止,直到其中一个子节点终止,然后您返回子节点的PID及其退出状态。基于此,您可以对另一个子进行kill(2),并重新执行fork序列以生成两个子进程的新实例。
请注意,在杀死第二个孩子后,您的下一个waitpid调用将返回该PID的PID,而不是新的一对孩子。因此,您需要检查返回的PID与两个当前子项的PID,如果不匹配则忽略它。