Linuxでバックグラウンド実行した処理が終わるまで待機したいと思ったことはありませんか?
そんなときに便利なのがwaitコマンドです。
waitコマンドを使うと、バックグラウンドで実行しているジョブやプロセスの終了を待ってから次の処理を実行できます。
シェルスクリプトでは特によく利用されるコマンドで、複数の処理を並列実行したあと、すべて終了してから後続処理を行いたい場面で活躍します。
この記事では、waitコマンドの基本的な使い方から、PIDやジョブ番号の指定方法、終了ステータスの取得、シェルスクリプトでの活用方法まで初心者向けに分かりやすく解説します。
waitコマンドとは
waitは、バックグラウンドで実行中のジョブやプロセスが終了するまで待機するためのシェル組み込みコマンドです。
処理が終了するとwaitコマンドも終了し、その後のコマンドが実行されます。
waitコマンドの基本構文
wait [PID | %ジョブ番号]
引数を指定しない場合は、現在のシェルで実行中のバックグラウンドジョブすべての終了を待機します。
wait
バックグラウンドジョブを待機する
まずはバックグラウンドで処理を実行します。
sleep 10 &
sleep 20 &
続いてwaitコマンドを実行します。
wait
すべてのジョブが終了するまで待機し、その後プロンプトへ戻ります。
特定のジョブだけ待機する
ジョブ番号を指定すると、そのジョブだけ終了を待機できます。
wait %1
ジョブ番号はjobsコマンドで確認できます。
jobs
PIDを指定して待機する
PIDを指定して待機することも可能です。
wait 2458
特定のプロセスだけ終了を待ちたい場合に便利です。
終了ステータスを取得する
waitコマンド実行後は、終了ステータスを確認できます。
echo $?
正常終了なら通常は「0」が返されます。
シェルスクリプトで利用する例
複数の処理を並列実行し、すべて終了してから後続処理を行う例です。
#!/bin/bash
sleep 5 &
sleep 8 &
wait
echo "すべての処理が終了しました"
バッチ処理やバックアップ処理などで非常によく利用される書き方です。
PIDを変数へ保存して待機する
起動したプロセスのPIDを保存しておくと、そのプロセスだけ待機できます。
python app.py &
PID=$!
wait $PID
$!には直前にバックグラウンド実行したプロセスのPIDが格納されます。
waitとsleepの違い
| コマンド | 役割 |
|---|---|
wait |
ジョブ・プロセスの終了を待つ |
sleep |
指定時間だけ待機する |
waitは「処理が終わるまで待つ」、sleepは「時間が経過するまで待つ」という違いがあります。
複数のジョブを並列実行して待機する
waitコマンドは、複数のバックグラウンドジョブをまとめて待機する場面で特に活躍します。
sleep 5 &
sleep 10 &
sleep 15 &
wait
echo "すべて終了しました"
最後のジョブが終了すると、次の処理が実行されます。
特定のPIDだけ待機する
複数のプロセスが動作している場合でも、PIDを指定すればそのプロセスだけ終了を待機できます。
python app.py &
PID=$!
wait $PID
対象のプロセスだけ待機したいシェルスクリプトでよく利用されます。
複数のPIDを指定して待機する
複数のPIDをまとめて指定することも可能です。
wait 2458 2461
指定したすべてのプロセスが終了するとwaitも終了します。
waitとjobsの違い
| コマンド | 役割 |
|---|---|
wait |
ジョブ・プロセスの終了を待機する |
jobs |
現在のジョブ一覧を表示する |
jobsで現在のジョブを確認し、その後waitで終了を待つという流れが一般的です。
waitとnohupの違い
| コマンド | 用途 |
|---|---|
wait |
処理が終了するまで待機する |
nohup |
ログアウト後も処理を継続する |
waitは処理の終了を待つコマンドであり、nohupのようにバックグラウンド実行を開始するコマンドではありません。
waitと&の関係
waitは、バックグラウンド実行(&)と組み合わせて利用することがほとんどです。
command1 &
command2 &
wait
echo "完了"
並列実行しながら、最後にすべての処理が終わるまで待機できます。
シェルスクリプトでの実践例
複数のバックアップ処理を並列実行する例です。
#!/bin/bash
backup_home &
backup_db &
backup_log &
wait
echo "バックアップ完了"
それぞれの処理を同時に実行し、すべて終了したあとで完了メッセージを表示できます。
よくあるエラー・注意点
waitがすぐ終了する
待機対象となるバックグラウンドジョブが存在しない可能性があります。
まずはjobsコマンドでジョブを確認してください。
jobs
No such processと表示される
指定したPIDやジョブが既に終了している可能性があります。
psコマンドやpgrepコマンドで状態を確認しましょう。
別のSSHセッションのプロセスをwaitできない
waitは現在のシェルで起動したジョブ・プロセスを対象とするシェル組み込みコマンドです。
別セッションで起動したプロセスの終了を待機することはできません。
waitはプロセスを終了しますか?
いいえ。
waitは終了を待機するだけであり、プロセスを停止・終了させる機能はありません。
よくある質問
waitコマンドは何をするコマンドですか?
バックグラウンドジョブやプロセスが終了するまで待機するコマンドです。
引数を指定しないとどうなりますか?
現在のシェルで実行中のすべてのバックグラウンドジョブが終了するまで待機します。
PIDとジョブ番号のどちらも指定できますか?
はい。PIDまたは%ジョブ番号のどちらでも指定できます。
waitで終了ステータスを取得できますか?
はい。
wait実行後にecho $?で終了ステータスを確認できます。
シェルスクリプトではよく使いますか?
はい。
複数処理を並列実行し、すべて終了してから後続処理を実行するためによく利用されます。
まとめ
waitコマンドは、Linuxでバックグラウンドジョブやプロセスの終了を待機するための基本コマンドです。
特に次のコマンドは覚えておくと便利です。
| コマンド | 用途 |
|---|---|
wait |
すべてのジョブを待機する |
wait %1 |
特定のジョブを待機する |
wait PID |
特定のPIDを待機する |
jobs |
ジョブ一覧を確認する |
echo $? |
終了ステータスを確認する |
PID=$! |
直前に起動したバックグラウンドプロセスのPIDを取得する |
Linuxでシェルスクリプトを書く際は、「バックグラウンド実行(&)→ jobsで確認 → waitで終了待機 → 終了ステータスを確認して後続処理を実行」という流れを覚えておくと、並列処理を安全かつ効率的に制御できるようになります。




コメント