如何用bash启动和监控一组程序?

问题描述 投票:1回答:1

我使用的系统是由一个类似脚本启动的。

#!/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).

谢谢!

linux bash process wait
1个回答
1
投票

我会用 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.

© www.soinside.com 2019 - 2024. All rights reserved.