當其中 1 個返回退出代碼 1 時停止所有子進程

當其中 1 個返回退出代碼 1 時停止所有子進程

我有 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

相關內容