Bash 成功执行并行脚本后运行shell脚本

Bash 成功执行并行脚本后运行shell脚本,bash,shell,unix,Bash,Shell,Unix,我有4个shell脚本,前3个脚本我想并行执行。在成功完成所有3个脚本之后,我想执行第4个脚本 Parellelexecution sh script1.sh, sh script2.sh, sh script3.sh script4.sh应该在所有3次执行之后执行。在bash中,您可以执行以下操作: pids= for s in script1.sh script2.sh script3.sh; do $s & pids="$pids $

我有4个shell脚本,前3个脚本我想并行执行。在成功完成所有3个脚本之后,我想执行第4个脚本

Parellelexecution  
     sh script1.sh,
     sh script2.sh,
     sh script3.sh
script4.sh应该在所有3次执行之后执行。

在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\u FAILED
将设置为字符串
true
,但所有进程仍处于等待状态。所有前3个脚本完成后,脚本将检查是否有任何作业失败。如果没有,则运行script4.sh。

在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\u FAILED
将设置为字符串
true
,但所有进程仍处于等待状态。所有前3个脚本完成后,脚本将检查是否有任何作业失败。如果没有,则运行script4.sh。

bash
4.3在
wait
中添加了一个
-n
标志,允许它等待任何一个后台作业完成。对于固定数量的后台工作,您可以使用

script1.sh &
script2.sh &
script3.sh &
wait -n && wait -n && wait -n && script4.sh

对于大量或可变数量的后台作业,Kurt的答案更好。

bash
4.3在
wait
中添加了一个
-n
标志,允许它等待任何一个后台作业完成。对于固定数量的后台工作,您可以使用

script1.sh &
script2.sh &
script3.sh &
wait -n && wait -n && wait -n && script4.sh

对于大量或可变数量的后台作业,Kurt的答案更好。

您可能只需要设置一个
JOB\u FAILED
标志,而不是在第一次失败时退出。所有后台作业完成后,只有在未设置“作业失败”时才运行
script4.sh
。@Kurtststutsman感谢大家,这正是我所期待的,而不是在第一次失败时退出,您可能只需要设置一个
JOB\u FAILED
标志。所有后台作业完成后,只有在未设置“作业失败”时才运行
script4.sh
。@Kurtststutsman感谢大家,这正是我想要的