【问题标题】:wait for all child processes in background to complete and exit with return code of last child process等待后台所有子进程完成并以最后一个子进程的返回码退出
【发布时间】:2014-01-30 18:29:52
【问题描述】:

我有一个这样的外壳

 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,例如换句话说 - 如果它在其中触发的所有进程都成功(内部 1..4)&& inner4.ksh 成功,我想说 middle.ksh 运行良好。 如果 inner4.ksh 失败 - middle.ksh 失败。 现在我可以收集每个 PID 并说wait p1 p2 p3 etc 问题是所有这些子 shell 都是在包装器(middle.ksh)中动态编写的,所以我不知道有多少 inner.ksh 可以是 10 -可以是 100 可以轻松完成吗?或者我错过了什么。 太棒了

【问题讨论】:

    标签: linux shell background pid exit-code


    【解决方案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*.ksh 作业并在它们全部完成后退出,第二个运行最后一个inner*.ksh 作业。完成这两项工作后,您只需在第一项上wait,然后在第二项上wait。如果wait $last_pidmiddle.ksh中的最后一个命令,则可以直接退出; wait 的退出状态(这是它等待的单个 inner*.ksh 作业的退出状态)将是 middle.ksh 的退出状态。否则,只需在wait 之后紧跟rc=$? 即可保存返回值,以供以后middle.ksh 退出时使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 2021-07-26
      • 1970-01-01
      • 2010-09-26
      相关资源
      最近更新 更多