シェルスクリプトにおいてバックエンドで実行したコマンドの同期を取る方法
概要
シェルスクリプトでは wait コマンドにプロセス ID を指定することで同期がとれる
wait コマンドのサンプル
sleep コマンドをバックグラウンドで実行させ,wait コマンドで同期をとる
バックグランドで実行したコマンドのプロセス ID は $! で取得できる
#!/bin/bash for ((i=0; i<3; i++)) do sleep 5 & array[i]=$! echo "Sleeping: ${i} : ${array[i]}" done wait ${array[@]} echo "Finish!!"
シェルスクリプトで同期を取るサンプルコード
シェルスクリプト内で別のシェルスクリプトをバックグラウンドで実行し,終了の同期をとる
また,プロセス ID は重複しないはずなので配列の添字にも使える.
run.sh
#!/bin/bash ./myshell1.sh & array[$!]=$! ./myshell2.sh & array[$!]=$! ./myshell3.sh & array[$!]=$! wait ${array[@]} echo "Finish"
myshell{1, 2, 3}.sh
#!/bin/bash echo "$0: Sleeping..." sleep 5
実行方法と結果
$ ./run.sh ./myshell1.sh: Sleeping... ./myshell2.sh: Sleeping... ./myshell3.sh: Sleeping... Finish
[余談] 別のファイルにしないでバックグラウンドで実行する場合
グループ化してバックグラウンドで実行すれば良い
#!/bin/bash { echo "Sleeping1..." sleep 5 } & array[$!]=$! { echo "Sleeping2..." sleep 5 } & array[$!]=$! { echo "Sleeping3..." sleep 5 } & array[$!]=$! wait ${array[@]} echo "Finish"