シェルスクリプトで長い処理を待っている間に別の処理を実行する
長いコマンドを処理している間に別のコマンドを実行したい場合、以下のようにすればよい。
long_command & # 長い処理をバックグラウンドで実行
jobid=$! # プロセスIDを取得
other_command # 待っている間に別の処理を実行
wait $jobid # 長い処理が終わるのを待つ
&
で長い処理をバックグラウンドで実行し、$!
でそのプロセスIDを取得する。other_command
で待っている間に別の処理を実行する。other_command
は&
をつけずに実行しているのでブロックする。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
\第一線のプログラマーの行動原理を学べる!/