2014-01-30 67 views
0

我有這樣等待與去年子進程的返回碼在後臺完成,並退出所有的子進程

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 

一個殼,我想這樣做 --find出如果所有的在後臺發起的進程已經完成。 - 全部完成後,我希望middle.ksh以上一個子進程的返回代碼退出 - 例如上面的例如inner4.ksh。換句話說 - 我想說middle.ksh運行良好,如果它內部觸發的所有進程成功(內部1..4)& & inner4.ksh成功。 如果inner4.ksh失敗 - middle.ksh失敗。 現在我可以收集每個PID,並說wait p1 p2 p3 etc 問題是所有這些孩子的貝殼動態地寫在包裝(middle.ksh),所以我不知道有多少inner.ksh會有可以是10-可以是100 可以它很容易完成 - 或者我錯過了一些東西。 TY

回答

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退出時保存返回值。