意外に記事がなかったのでメモも兼ねて記載します。
シェルスクリプトで途中の処理を並列実行して、それらが全て正常終了したら後続をどれか一つでも異常終了したら処理終了としたいことはないでしょうか?
今回はその方法を記載します。
目次
サンプルコード
#!/bin/bash
処理1 &
pid1=$!
処理2 &
pid2=$!
処理3 &
pid3=$!
wait $pid1
result1=$?
wait $pid2
result2=$?
wait $pid3
result3=$?
if [ $result1 -eq 0 ] && [ $result2 -eq 0 ] && [ $result3 -eq 0 ]
then
echo "success"
後続処理など
exit 0
else
echo "fail"
exit 6
fi
説明
以下コードの説明になります
1. 並列実行したい処理をバックグラウンドで実行させる
処理をバックグラウンド実行させるには最後に&を付与します。
バックグラウンド実行することでその処理を動かしつつ後続の処理が流れます。
2. バックグラウンド実行した処理のpid(プロセスID)を取得します。
バックグラウンド実行の処理のpidは#!で取得できます。
ただし、取得前に別処理を動かしてしまうとその処理で上書きされてしまうので、別途変数を用意してすぐに格納しておきます。
これを並行実行したい処理分繰り返します。
3. バックグラウンド実行処理が終わるまで待つ
バックグラウンド処理の完了を待つためにはwaitコマンドを実行します。
waitコマンドは引数に対象バックグラウンド実行している処理のpidを指定することでその処理の完了を待ちます。完了まで後続に進みません。
wait 対象バックグラウンド処理のpid
4. 対象処理のバックグラウンド処理のステータスを取得
wait処理のあとは対象処理の終了ステータスが#?に格納されています。
これも別のwaitを実行すると上書きされてしまうので、すぐに別の変数に格納します。
通常正常終了の場合は終了ステータスは0かと思いますが、そこはご自分の処理に合わせてください。
残りの2プロセスも同様に処理します。
5. 最後に変数に格納したステータスをチェック
4で格納した終了ステータスをチェックして全て正常終了なら後続へ
どれか一つでも異常終了してたら処理を終了します。
以上です。試してみてください。
コメントを書く