gpt4 book ai didi

linux - 具有错误控制的 shell 并行编程

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:43 30 4
gpt4 key购买 nike

这是我的代码(从 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,我尝试实现这个:一个任务失败,杀死其他两个并退出 shell,但失败了,这是我的修改代码:

#/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 语句放在等待之前和之后,得到的不是我想要的,我怎样才能实现我的目标:一个任务失败,杀死另外两个并退出shell

最佳答案

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

关于linux - 具有错误控制的 shell 并行编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53314245/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com