![當其中 1 個返回退出代碼 1 時停止所有子進程](https://rvso.com/image/1416383/%E7%95%B6%E5%85%B6%E4%B8%AD%201%20%E5%80%8B%E8%BF%94%E5%9B%9E%E9%80%80%E5%87%BA%E4%BB%A3%E7%A2%BC%201%20%E6%99%82%E5%81%9C%E6%AD%A2%E6%89%80%E6%9C%89%E5%AD%90%E9%80%B2%E7%A8%8B.png)
我有 2 個或更多建置進程在後台運行。如果其中一個進程以 0 以外的程式碼退出,我想停止所有建置進程。
./build-1.sh &
./build-2.sh &
./build-3.sh &
wait
#other steps
目前,我使用wait
它需要等待所有進程完成。但如果其中 1 個失敗,我想停止所有其他建置。我該怎麼做呢?
答案1
您正在尋找的通常稱為 a named pipe
,用於進程間通訊 (IPC)。關於在 Bash 中建立命名管道有很多很棒的文檔,因此我將讓您自行編寫程式碼。
一旦你有了一個命名管道,你可以做一些事情,例如將每個進程的 PID 寫入管道(使用$$
當前 PID 的 Bash 特殊變數),然後讓每個進程進入循環檢查是否存在每個 PID。如果它遇到一個不再存在的進程(進程死亡或被殺死),那麼它可以採取行動。
您可以將類似的內容放在腳本的適當部分中。請先測試一下。 :)
trap "rm -f $named_pipe" EXIT
# Assuming you have a file under $named_pipe with space-delimited PIDs
pids = $(< $named_pipe)
while :
do
for pid in pids:
do
if ! kill -0 $pid;
then
exit
fi
done
done