具有错误控制的Shell并行编程

时间:2018-11-15 07:20:15

标签: linux shell

这是我的代码(从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语句,就不要了我想要的,我该如何实现我的目标:一个任务失败了,杀死另外两个并退出炮弹

1 个答案:

答案 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