
我嘗試製作一個 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
}