![1 の子プロセスが終了コード 1 を返したら、すべての子プロセスを停止します。](https://rvso.com/image/1416383/1%20%E3%81%AE%E5%AD%90%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%8C%E7%B5%82%E4%BA%86%E3%82%B3%E3%83%BC%E3%83%89%201%20%E3%82%92%E8%BF%94%E3%81%97%E3%81%9F%E3%82%89%E3%80%81%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E5%AD%90%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%92%E5%81%9C%E6%AD%A2%E3%81%97%E3%81%BE%E3%81%99%E3%80%82.png)
バックグラウンドで実行するビルド プロセスが 2 つ以上あります。そのうちの 1 つが 0 以外のコードで終了した場合、すべてのビルド プロセスを停止します。
./build-1.sh &
./build-2.sh &
./build-3.sh &
wait
#other steps
現在、wait
すべてのプロセスが完了するまで待機する必要があるものを使用しています。ただし、そのうちの 1 つが失敗した場合は、他のすべてのビルドを停止したいと思います。どうすればよいでしょうか?
答え1
あなたが探しているのは、一般的に と呼ばれnamed pipe
、プロセス間通信 (IPC) に使用されます。Bash で名前付きパイプを作成する方法については、優れたドキュメントが数多くあるので、そのためのコードを書くのはあなたにお任せします。
名前付きパイプを配置したら、各プロセスの PID をパイプに書き込む ($$
現在の PID の Bash 特殊変数を使用) などの操作を実行し、各 PID の存在を確認するループを各プロセスに実行させます。存在しない 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