我有4个shell脚本,前3个我希望并行执行的脚本。在成功完成所有3个脚本后,我想执行第4个脚本
Parellelexecution
sh script1.sh,
sh script2.sh,
sh script3.sh
script4.sh应该在所有3次执行后执行。
答案 0 :(得分:2)
在bash中你可以这样做:
pids=
for s in script1.sh script2.sh script3.sh; do
$s &
pids="$pids $!"
done
JOBS_FAILED=false
for pid in $pids; do
if ! wait $pid; then
# script didn't exit successfully
JOBS_FAILED=true
fi
done
if [[ $JOBS_FAILED == false ]]; then
script4.sh
fi
首先,它在后台启动所有前3个脚本并收集它们的pid。然后它会遍历每个pid,等待它退出并检查其返回值。如果前三个脚本中的任何一个失败,$JOBS_FAILED
将设置为字符串true
,但仍会等待所有进程。完成前3个脚本后,脚本会检查是否有任何作业失败。如果没有,则运行script4.sh。
答案 1 :(得分:2)
bash
4.3向-n
添加了wait
标记,让它等待任何一个后台作业完成。对于固定数量的后台作业,您可以使用类似
script1.sh &
script2.sh &
script3.sh &
wait -n && wait -n && wait -n && script4.sh
对于大量或可变数量的后台工作,Kurt的答案更好。