对一组进程进行分组,当一个进程死亡时,该组中的所有其他进程也会死亡

对一组进程进行分组,当一个进程死亡时,该组中的所有其他进程也会死亡

由于各种原因,我们的应用程序由 3 个进程组成,无法合并为一个进程。这些进程关系非常紧密,因此一起生成和终止它们是有意义的。例如,如果其中任何一个进程死亡,整个系统将无法运行,因此只需终止其他两个进程即可。

这可以在 Linux 中完成吗?

答案1

总体而言,我支持G-Man 的回答。我想介绍一个在某些情况下可能足够的快速解决方案。

假设三个可执行文件分别为foobarbaz。假设:

  • 您可以手动运行它们;
  • 您以同一个用户身份运行它们;
  • 在任何给定时间,您最多运行一次foo、一次bar和一次。baz

而不是foofoo ; killall bar 2>/dev/null
而不是barbar ; killall baz 2>/dev/null。而不是跑。
而不是bazbaz ; killall foo 2>/dev/null

如果您想foo在后台运行,正确的语法如下:

{ foo ; killall bar 2>/dev/null ; } &

bar和 也类似baz。这样,如果你愿意的话,可以从单个 shell 运行它们。

killall该解决方案可扩展到任何合理数量的进程。当一个进程终止时,将触发菊花链。这最终将播放激流金属杀死所有人。

请注意,在您确定此终止链已完成之前,您不应该启动一组新的进程。

答案2

我不知道有什么方法可以直接做到这一点;即让 Linux 自动处理进程清理。我相信您需要有第四个进程来监视其他三个进程的状态,并在一个进程终止时终止其余两个进程。

如果有可能让所有三个进程都由同一个父进程启动,那么这可能是最好的方法——让父进程执行一个wait(),当任何子进程终止时它将返回。如果这不是一个选项,请专门编写一个新程序来执行监控。您必须告诉它这三个进程的 PID。它可以通过定期尝试向它们发送信号 0 来检查它们是否处于活动状态。(监控进程必须在与其他进程相同的 UID 下运行,或者以 root(UID 0)的身份运行,以便有权向它们发送信号。)

相关内容