![对一组进程进行分组,当一个进程死亡时,该组中的所有其他进程也会死亡](https://linux22.com/image/1536640/%E5%AF%B9%E4%B8%80%E7%BB%84%E8%BF%9B%E7%A8%8B%E8%BF%9B%E8%A1%8C%E5%88%86%E7%BB%84%EF%BC%8C%E5%BD%93%E4%B8%80%E4%B8%AA%E8%BF%9B%E7%A8%8B%E6%AD%BB%E4%BA%A1%E6%97%B6%EF%BC%8C%E8%AF%A5%E7%BB%84%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E5%85%B6%E4%BB%96%E8%BF%9B%E7%A8%8B%E4%B9%9F%E4%BC%9A%E6%AD%BB%E4%BA%A1.png)
由于各种原因,我们的应用程序由 3 个进程组成,无法合并为一个进程。这些进程关系非常紧密,因此一起生成和终止它们是有意义的。例如,如果其中任何一个进程死亡,整个系统将无法运行,因此只需终止其他两个进程即可。
这可以在 Linux 中完成吗?
答案1
总体而言,我支持G-Man 的回答。我想介绍一个在某些情况下可能足够的快速解决方案。
假设三个可执行文件分别为foo
、bar
和baz
。假设:
- 您可以手动运行它们;
- 您以同一个用户身份运行它们;
- 在任何给定时间,您最多运行一次
foo
、一次bar
和一次。baz
而不是foo
跑foo ; killall bar 2>/dev/null
。
而不是bar
跑bar ; killall baz 2>/dev/null
。而不是跑。
而不是baz
跑baz ; 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)的身份运行,以便有权向它们发送信号。)