waitコマンドとは?Linuxでバックグラウンドジョブの終了を待機する方法

Linux

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で終了待機 → 終了ステータスを確認して後続処理を実行」という流れを覚えておくと、並列処理を安全かつ効率的に制御できるようになります。

コメント

タイトルとURLをコピーしました