從並行運行的子 shell 取得退出程式碼

從並行運行的子 shell 取得退出程式碼

我嘗試製作一個 shell 腳本來啟動一系列長時間運行的進程。我們稱它們為a、b、c、d 和e。進程 b、c 和 d 應並行運行,進程 e 必須在前面的所有進程終止後運行成功地

這是我的(偽)程式碼:

{
    echo "starting a"
    a
}&&
{
    (echo "starting b"; b; exit $?)&
    (echo "starting c"; c; exit $?)&
    (echo "starting d"; d; exit $?)&
    wait
}&&
{
    echo "starting e"
    e
}

我的問題是,如果 b、c、d 中的任何一個失敗,腳本將繼續並執行 e。有辦法防止這種情況嗎?

非常感謝您的任何答覆!

安托萬

答案1

{
    (echo "starting b"; b)&
    (echo "starting c"; c)&
    (echo "starting d"; d)&
    wait %1 && wait %2 && wait %3
}&&

當等待特定作業時wait返回該作業退出代碼

要理解,請看這兩個範例:
只有最後一行很重要(顯示 的退出狀態wait

(sleep 3; false) & wait; echo $?
[1] 25358
[1]+  Exit 1                  ( sleep 3; false )
0

--

(sleep 3; false) & wait %1; echo $?
[1] 25362
[1]+  Exit 1                  ( sleep 3; false )
1

答案2

透過在背景執行一個進程,您基本上已經告訴 shell 您對其成功或失敗不感興趣。

wait 將要報告其退出代碼中任何訊號的值(如果適用)。這不是您要找的。

解決方案是讓每個命令向 stdout 報告其狀態並使用 grep 計算回應數。

{
  (echo "starting b"; b && echo ok)&
  (echo "starting c"; c && echo ok)&
  (echo "starting d"; d && echo ok)&
} | 
grep -c ok | ( read n && (( n==3 )) ) && 

{
echo "starting e"; e
}

相關內容