我有一個 BASH 可以在我的 BASH 中并行運行 3 個函式。
functionA () {
......
my command || { echo "ERROR!!" >> $LOG_FILE ; exit 1 ;}
}
functionB () {
......
my command || { echo "ERROR!!" >> $LOG_FILE ; exit 1 ;}
}
functionC () {
......
my command || { echo "ERROR!!" >> $LOG_FILE ; exit 1 ;}
}
functionA &
functionB &
functionC &
wait
我在所有函式中都有一些用于錯誤處理的命令,如下所示:
my command || { echo "ERROR!!" >> $LOG_FILE ; exit 1 ;}
我注意到,即使我在所有函式中都有用于錯誤處理的退出 1,但其他函式仍在繼續。如果任何功能失敗,如何停止 bash 并回傳退出代碼 1?
我對 BASH 很陌生,感謝任何幫助!
uj5u.com熱心網友回復:
像這樣的東西可能適合您的用例:
更新:用大量同時終止的子行程測驗代碼表明需要某種排他鎖定機制,所以我實作了一個簡單的(我希望應該是原子的)與廣泛可用的mktemp -d和ln -s.
#!/bin/bash
lockdir=$(mktemp -d) || exit "$?"
trap 'exit 1' ABRT
trap 'mv "$lockdir" "$lockdir~" && rm -rf "$lockdir~"; kill 0' EXIT
diex() { ln -s _ "$lockdir/.lock" 2> /dev/null && kill -ABRT "$$"; }
functionA () { sleep 2; echo "ERROR!!"; diex; }
functionB () { sleep 4; echo "GOODY!!"; }
functionA &
functionB &
wait
說明:
這個想法是讓子行程kill -ABRT "$$"在失敗時通知主腳本。我選擇SIGABRT信號是因為它適合中止的目的,但作為附帶效果,它也會阻止自動生成核心轉儲,通常在接收時完成SIGABRT。如果您正在運行支持的作業系統,SIGUSR1或者SIGUSR2您應該使用它。
在腳本的開頭,您定義了一些信號偵聽trap器,將捕獲指定型別的信號時要運行的命令關聯起來:
信號的偵聽器
EXIT(例如由exit主腳本背景關系中的命令觸發)將終止腳本及其所有子行程kill 0。(由子行程發送)的偵聽器
SIGABRT不僅會生成EXIT信號,還會將退出狀態設定為1.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/457883.html
