等待后台中的所有子进程完成并退出上一个子进程的返回码

时间:2014-01-30 18:29:52

标签: linux shell background pid exit-code

我有一个像这样的shell

 middle.ksh <parameter>
     inner1.ksh <para> > Log 2>&1 &
     p1=$!

     inner2.ksh <para> > log 2>&1 &
     p2=$!
     inner3.ksh <para> > log 2>&1 &
     p2=$!
     sleep nnn 
      inner4.ksh <para> > log 2>&1 & /#  L1last process fired 
     p2=$!
     rc=$? /#  I am checking the rc for the last process 
     wait 

我想做这样的事情 - 找出所有在后台触发的进程是否已完成。 - 当所有内容都已完成时,我希望middle.ksh退出并返回上一个子进程的返回代码 - 例如上面的inner4.ksh例如:换句话说 - 我想说mid.ksh在它内部触发的所有进程成功(内部1..4)&amp;&amp; inner4.ksh成功了。 如果inner4.ksh失败 - middle.ksh失败了。 现在我可以收集每个PID并说出wait p1 p2 p3 etc 问题是所有这些子shell都是在包装器(middle.ksh)中动态编写的,所以我不知道有多少inner.ksh会有10个可以100个 可以轻松完成 - 或者我错过了什么。 TY

1 个答案:

答案 0 :(得分:1)

这有点令人费解,但是......

{
     inner1.ksh ... &
     inner2.ksh ... &
     # and all the rest but one of the inner*.ksh jobs
     wait
} &
all_but_one_pid=$!
innerN.ksh ... &
last_pid=$!
wait $all_but_one_pid
wait $last_pid

middle.ksh有两个进程:一个运行并行运行inner*.kshinner*.ksh个作业,并在完成后退出,另一个运行最后一个wait作业。完成这两项工作后,您只需在第一项wait,然后在第二项wait $last_pid。如果middle.kshwait中的最后一个命令,则可以退出; inner*.ksh的退出状态(即等待的单个middle.ksh作业的退出状态)将是rc=$?的退出状态。否则,只需在wait之后立即放置middle.ksh,以便在{{1}}退出时保存返回值。