はじめに
バッシュwait commandは、バックグラウンドで実行されているプロセスが完了するのを待機し、終了ステータスを返すシェルコマンドです。指定された時間待機するsleepコマンドとは異なり、 wait コマンドは、すべてまたは特定のバックグラウンドタスクが終了するのを待ちます。
このチュートリアルでは、waitについて説明します コマンド構文とbashスクリプトコードの例を提供します。
前提条件
- コマンドライン/ターミナルへのアクセス。
- 管理者(sudo)権限。
- VimやNanoなどのテキストエディタ。
bashwaitコマンド構文
待機を使用するにはさまざまな方法があります bashスクリプトのコマンド。次の表は、各ユースケースを説明しています。
| コマンド | 説明 |
|---|---|
wait | パラメータがない場合、wait コマンドは、スクリプトを続行する前に、すべてのバックグラウンドプロセスが終了するのを待ちます。 |
wait <process or job ID> | 追加されたPIDまたはジョブIDは、特定のプロセスが終了するのを待ってから、スクリプトを続行します。 |
wait -n | 次のバックグラウンドプロセスのみが完了するのを待って、終了ステータスを返します。 |
wait -f | プログラムを終了すると、最初にバックグラウンドタスクが終了するのを待ってから終了します。 |
待機コマンドの例
待機を使用するときに知っておくべき3つの追加パラメータがあります bashスクリプトの場合:
1.アンパサンド記号( & )コマンドがバックグラウンドジョブを示した後。
2. $! 最後のバックグラウンドプロセスのPIDをフェッチします。複数のバックグラウンドプロセスを操作する場合は、以前のPIDを変数に保存します。
3. $? 最後のプロセスの終了ステータスを出力します。
これらの3つのパラメータがどのように連携するかを確認するには、ターミナルウィンドウを開いて、次のコマンドを実行します。
sleep 10 &
echo $!
echo $?
$! パラメータはバックグラウンドプロセスのPIDを格納し、 $? 終了ステータスを保存します。終了ステータス0 コマンドが正常に終了したことを示します。
単一プロセス待機の例
1.ターミナルを開いて、簡単なバックグラウンドプロセスを作成することから始めます。
sleep 10 & 2.ジョブがバックグラウンドで実行されていることを確認します:
jobs -l
3. waitを使用します プロセスが完了するまで一時停止するパラメータなしのコマンド:
wait
ターミナルは、バックグラウンドプロセスが終了するのを待ちます。
10秒後(sleep 10による )、コンソールは完了を出力します メッセージ。
単一プロセスのbash待機の例
waitを使用します スクリプト内でバックグラウンドプロセスを実行する必要があるポイントを示すコマンド。
1.たとえば、テキストエディタに次のコードを追加します。
#!/bin/bash
echo Background process &
echo First message
echo Second message
wait
echo Third message
バックグラウンドプロセスが最初と2番目のプロセスを完了しない場合、wait コマンドは一時停止を呼び出して、2番目のプロセスの後にバックグラウンドプロセスが完了するのを待ってから、3番目のプロセスに進みます。
2.スクリプトをsingle_process.shとして保存します 。ターミナルで、権限を変更してスクリプトを実行可能にします。
sudo chmod +x single_process.sh 3.次のコマンドを使用してスクリプトを実行します:
./single_process.sh
バックグラウンドプロセスは、waitの前であればいつでも完了します。 コマンドを実行すると、スクリプトが続行されます。
複数のプロセスが例を待つ
1.テキストエディタを開き、複数のプロセスを含む次のスクリプトを追加します。
#!/bin/bash
sleep 10 &
sleep 15 &
sleep 5 &
echo $(date +%T)
wait
echo $(date +%T)
スクリプトは、 waitの前後の現在の時刻を出力します 指図。パラメータがない場合、プログラムはすべてのプロセスが終了するのを待ちます。
2.スクリプトをtest.shとして保存します ファイルを閉じます。次に、スクリプトを実行可能にします。
sudo chmod +x test.sh 3.最後に、次のコマンドでプログラムを実行します:
./test.sh
プロセスはバックグラウンドで実行されるため、3つすべてが15秒で完了します。
4.同じスクリプトを使用して、次のユースケースをテストします。
-
-nを追加します<strong>wait</strong>へのパラメータ 。最速のプロセスのみが完了し、スクリプトは10秒で終了します。 - ジョブIDを追加して、スクリプトが待機するジョブを示します。たとえば、
wait %1プロセス1で一時停止します(sleep 10)完了します。
複数のプロセスがPIDの例でbash待機
1.複数のプロセスを操作する場合は、PIDを使用してプロセスを識別します。以下のサンプルスクリプトは、単一のユースケースを示しています。
#!/bin/bash
echo "Process 1 lasts for 2s" && sleep 2 &
PID=$!
echo "Process 2 lasts for 3s" && sleep 3 &
echo "Current time $(date +%T)"
wait $PID
echo "Process 1 ended at time $(date +%T) with exit status $?"
wait $!
echo "Process 2 ended at time $(date +%T) with exit status $?"
2.スクリプトをmulti_wait.shとして保存します 。次のコマンドでスクリプトを実行可能にします:
sudo chmod +x multi_wait.sh 3.スクリプトを実行して、出力を確認します。
./multi_wait.sh
スクリプトは最初のプロセスを完了するのに2秒かかります(sleepのため) 2 )と3秒で2番目のプロセスを完了します。 2つのプロセスは同時に実行され、両方とも3秒で完了します。