さてさて、久しぶりのシェルの時間。
スクリプト内でサブシェルを複数バックグラウンドで実行するケースについて。
ご存知の通り、サブシェルをすべてバックグランドで実行した後にwaitコマンドを実行すると
バックグラウンドで走っているシェルが全て終了するまで処理は先に進まない。
チョトマテチョトマテオニーサーン
waitコマンドって何ですのん?
って人はぐぐってください。
話を戻しまして、
全て終了したとしても、予期せぬエラーで中断されていた場合はそれを把握して後続の処理を実施したい場合があると思う。
これについて少しぐぐったところ、それぞれバックグラウンドプロセスで実行したサブシェルの終了ステータスの確認方法は基本的に
サブシェル & # バックグランドで実行する表記方法 wait $! echo $?
となっているが、こんな感じのを複数のサブシェルに対して実施し、結果を判定したい。
そんな要望に答えるスクリプトを作ってみた(かなり粗いが
どのサブシェルが失敗したかを見たい場合はこれを参考に発展させていただければと思う。
# judge_from_all_ps_retcode.sh #!/bin/bash array=() array2=() ERR_FLG=0 for i in $( seq 1 3 ); do ./test1.sh > /dev/null 2>&1 & array+=($!) done for sub_pid in "${array[@]}"; do wait ${sub_pid} array2+=($?) done for ret_code in "${array2[@]}"; do if [[ ${ret_code} -ne 0 ]]; then ERR_FLG=1 fi done if [[ ${ERR_FLG} -ne 0 ]]; then echo "Sub process failed." else echo "All sub process finished successfully." fi exit
上記スクリプトの中で実行しているテスト用スクリプトは以下の通り。ただただ10秒sleepしているだけである。
# test1.sh #!/bin/bash echo "sleep 10 seconds" sleep 10 exit
実行結果
# すべて正常に完了した場合 [vagrant@localhost worktemp]$ sh ./check_all_ps_retcode.sh All sub process finished successfully. #途中でサブシェルtest1.shをkillしたりした場合 [vagrant@localhost worktemp]$ sh ./check_all_ps_retcode.sh ./check_all_ps_retcode.sh: line 13: 8892 終了しました ./test1.sh > /dev/null 2>&1 Sub process failed.
※実行時にはtest1.shには実行権限をつけておくこと
チョトマテチョトマテオニーサーン
実行権限ってなんですのん?
って人はぐぐってください。
以上