由于各种原因,我们的应用程序由 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)的身份运行,以便有权向它们发送信号。)