我使用的系统是由一个类似脚本启动的。
#!/bin/bash
prog_a & # run continuously
prog_b & # run continuously
prog_c & # run continuously
sleep 2 # wait for some stuff to be done
prog_d # start 'main' program ...
killall -9 prog_a
killall -9 prog_b
killall -9 prog_c
很好用 如果我做一个 Ctrl-C (或者如果 prog_d 崩溃),那么 prog_d 就死了,第一个进程 prog_a, prog_b, prog_c 就会被杀死。
我遇到的问题是 有时 prog_a, prog_b 或 prog_c 崩溃了. 而prog_d还活着。事实上,我想要的是:如果一个程序死了,那么其他的程序也会被杀死。
能否用bash简单地做到这一点?我曾试着创建一个这样的程序。
wait pid1 pid2 pid3 ... # wait that pid1 or pid2 or pid3 died
但是没有成功 (我需要能够用ctrl-c来杀死 prog_d).
谢谢!
我会用 GNU Parallel它可以很好地处理任何作业失败时的问题......不管是一个或多个作业还是某个百分比的作业失败,不管其他作业是否应该立即终止,还是只允许不启动新的作业。
就你的具体情况而言
parallel -j 4 --halt now,fail=1 --line-buffer ::: progA progB progC 'sleep 2; progD'
上面写着... "并行运行所有四个作业,如果有任何作业失败,立即停止杀死所有其他作业。按行缓冲输出。要运行的作业是在 :::
而它们只是你的作业,但在最后一个作业之前有一个延迟。"
你可能会喜欢用作业名来标记输出,这样你就可以看到哪些输出来自于哪些进程,如果是这样,就用 parallel --tag ...
您可能想延迟每个作业的开始,在这种情况下,使用 parallel --delay 1
以1秒的时间间隔启动作业,并取消了 sleep 2
.