シェルスクリプトにおいてバックエンドで実行したコマンドの同期を取る方法

概要

シェルスクリプトでは 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"