シェルスクリプトで長い処理を待っている間に別の処理を実行する

長いコマンドを処理している間に別のコマンドを実行したい場合、以下のようにすればよい。

long_command & # 長い処理をバックグラウンドで実行
jobid=$!       # プロセスIDを取得
other_command  # 待っている間に別の処理を実行
wait $jobid    # 長い処理が終わるのを待つ
  1. &で長い処理をバックグラウンドで実行し、$!でそのプロセスIDを取得する。
  2. other_commandで待っている間に別の処理を実行する。other_command&をつけずに実行しているのでブロックする。
  3. wait $jobidで長い処理が終わるのを待つ。

プロセスIDの変数

$!は直前にバックグラウンドで実行したジョブのプロセスIDを取得するための変数。
後の処理でkillしたり、ジョブの状態を確認したりするために使用できる。

上記のスクリプトではwaitコマンドで終了を待つために使用している。

waitコマンド

waitコマンドは、指定したジョブが終了するまで待機するためのコマンド。
複数のIDを指定すると複数のジョブを同時に待てる。

command1 &
jobid1=$!
command2 &
jobid2=$!
command3 &
jobid3=$!
wait $jobid1 $jobid2 $jobid3

先述のコマンドでは以下のようにother_commandもバックグラウンドで実行してlong_commandとともに待つ方法もある。

long_command &
jobid1=$!
other_command
jobid2=$!
wait $jobid1 $jobid2