考虑以下shell脚本:
#!/bin/bash
set -e
foo
bar
baz
fini
这将依次串行执行子命令foo
、bar
和baz
,如果其中任何一个失败(set -e
(,则终止,然后执行fini
命令。
我如何修改此脚本,以便:
- 三个子命令
foo
、bar
和baz
并行执行 - 如果其中任何一个失败(exitcode不成功(,脚本将终止(如
set -e
(,并终止/等待任何正在运行的子命令 - 如果并且直到所有三个
foo
、bar
和baz
都已完成(并且已成功完成(,则不运行fini
命令
在后台运行的进程上使用作业控制内置程序,如wait
和kill
。
概念验证示例:
#!/usr/bin/env bash
echo "Starting jobs."
sleep 1 && echo "job 1" && exit 0 &
sleep 2 && echo "job 2 (Will fail)" && exit 1 &
sleep 3 && echo "job 3" && exit 0 &
echo "Waiting for jobs"
for ((n = 0; n < 3; n++)); do
if ! wait -n; then
echo "A job failed! Goodbye."
while read pid; do
kill $pid 2>/dev/null
done < <(jobs -p)
exit 1
fi
done
echo "One last task"