这是我的代码(从Linux Shell脚本编写手册中学习)
#/bin/bash
PIDARRAY=()
(echo aaa >> /dev/null;sleep 8; exit 0)&
PIDARRAY+=("$!")
(echo bbb >> /dev/null;sleep 4;echo helloworld; exit 1)&
PIDARRAY+=("$!")
(echo ccc >> /dev/null;sleep 16; exit 0)&
PIDARRAY+=("$!")
wait ${PIDARRAY[@]}
$!保存最后一个bg任务pid,所以PIDARRAY将保存三个bg任务pid,我尝试达到以下目的:一个任务失败,杀死另外两个任务并退出外壳,但是失败了,这是我的修改代码:
#/bin/bash
PIDARRAY=()
(echo aaa >> /dev/null;sleep 100; exit 0)&
PIDARRAY+=("$!")
(echo bbb >> /dev/null;sleep 4;echo helloworld; exit 1)&
PIDARRAY+=("$!")
(echo ccc >> /dev/null;sleep 100; exit 0)&
PIDARRAY+=("$!")
wait ${PIDARRAY[@]}
if [ $? -ne 0 ]; then
kill -9 PIDARRAY[0]
kill -9 PIDARRAY[1]
kill -9 PIDARRAY[2]
fi
有一个明显的错误,如果一个任务失败,我们只需要杀死另外两个任务,而不是三个,我在等待之前和之后都放置了if语句,就不要了我想要的,我该如何实现我的目标:一个任务失败了,杀死另外两个并退出炮弹
答案 0 :(得分:1)
我将使用 GNU Parallel 来有效地管理并行任务。因此,就您而言:
parallel --halt now,fail=1 ::: task1 task2 task3
提交工作的方式有上百万种,因此您可以将工作列表存储在名为jobs
的文件中:
echo aaa >> /dev/null;sleep 100; exit 0
echo bbb >> /dev/null;sleep 4; echo helloworld; exit 1
echo ccc >> /dev/null;sleep 100; exit 0
然后像这样运行:
parallel --halt now,fail=1 < jobs
输出
helloworld
parallel: This job failed:
echo bbb >> /dev/null;sleep 4; echo helloworld; exit 1