我正在尝试在Bash Shell中并行运行3个命令:
$ (first command) & (second command) & (third command) & wait
这样做的问题是,如果first command
失败,例如,退出代码是0
(我猜是因为wait
成功了)。
期望的行为是,如果其中一个命令失败,则退出代码将为非零(最好停止其他正在运行的命令)。
我该如何实现呢?
请注意,我希望并行运行这些命令!
我正在尝试在Bash Shell中并行运行3个命令:
$ (first command) & (second command) & (third command) & wait
这样做的问题是,如果first command
失败,例如,退出代码是0
(我猜是因为wait
成功了)。
期望的行为是,如果其中一个命令失败,则退出代码将为非零(最好停止其他正在运行的命令)。
我该如何实现呢?
请注意,我希望并行运行这些命令!
我能想到的最好的办法是:
first & p1=$!
second & p2=$!
...
wait $p1 && wait $p2 && ..
或者wait $p1 || ( kill $p2 $p3 && exit 1 )
...
但是这仍然强制按照进程的顺序进行检查,因此如果第三个进程立即失败,您将不会注意到它,直到第一和第二个完成。
parallel -j3 --halt 2 <list_of_commands.txt
这将同时运行3个命令。
如果任何一个正在运行的作业失败,它将终止其余正在运行的作业,然后停止,并返回失败作业的退出代码。
&&
而不是 &
。例如:first command && second command && third command && wait
wait_and_fail_on_first() {
local piderr=0 i
while test $# -gt 0; do {
dpid="$1"; shift
wait $dpid || { piderr=$?; kill $@; return $piderr ;}
} done
}
使用方法如下:
(first command) & pid1=$!
(second command) & pid2=$!
(third command) & pid3=$!
wait_and_fail_on_first $pid1 $pid2 $pid3 || {
echo "PID $dpid failed with code $?"
echo "Other PIDs were killed"
}
--halt 2 立即终止所有作业并退出,无需清理。退出状态将是失败作业的退出状态。
- potong