待つコード> 指定されたジョブが完了するのを待機し、待機中のコマンドの終了ステータスを返すコマンドです。
wait以降 コマンドは現在のシェル実行環境に影響し、ほとんどのシェルに組み込みコマンドとして実装されています。
この記事では、Bashに組み込まれている waitについて説明します。 コマンド。
wait コマンド#
waitの一般的な構文 ビルトインは次の形式を取ります:
wait [options] ID
ID プロセスまたはジョブIDです。 IDがない場合 が指定されている場合、コマンドはすべての子バックグラウンドジョブが完了するまで待機します。
wait commandは、最後に待機したコマンドの終了ステータスを返します。
たとえば、PID 7654のバックグラウンドプロセスを待機するには 、次を使用します:
wait 7654 複数のプロセスが指定されている場合、コマンドはすべてのプロセスが完了するのを待ちます。
ジョブは、ジョブを構成するプロセスを参照する方法であるジョブ仕様(「jobspec」)を使用して指定されます。 jobspecは、パーセント記号で始まり、その後にジョブ番号(%n が続きます) )。次に例を示します:
バックグラウンドでコマンドを実行します:
rsync -a /home /tmp/home & シェルジョブID(角かっこで囲まれている)とプロセスIDが端末に表示されます:
[2] 54377
ジョブを待つには、 waitを実行します コマンドの後にジョブ仕様が続く:
wait %2
-nで呼び出された場合 オプションの場合、コマンドは、指定されたpidまたはjobspecsからの単一のジョブが完了するのを待機し、その終了ステータスを返します。引数が指定されていない場合は、 wait -n バックグラウンドジョブが完了するのを待って、ジョブの終了ステータスを返します。
wait -n 45432 54346 76573
上記の例では、 wait -n 最初に終了するジョブの戻りステータスのみを出力します。ジョブのPIDは表示されません。終了ステータスが返されるジョブpidまたはjobspecを取得する場合は、 -pを使用します。 変数に割り当てるオプション:
wait -p job_id -n 45432 54346 76573
-p オプションはBash5.1で導入されました。古いバージョンのBashを使用すると、「無効なオプション」エラーが発生します。
-f オプションはwaitに指示します 各pidまたはjobspecが実際に終了するのを待ってから、終了コードを返します。ジョブのステータスが変更されたときに戻るのではありません。このオプションは、ジョブ制御が有効になっている場合にのみ有効です。デフォルトでは、ジョブ制御はインタラクティブプロンプトに対してのみ有効になっています。
待つコード> 通常、並行して実行される子プロセスを生成するシェルスクリプトで使用されます。
コマンドがどのように機能するかを説明するために、次のスクリプトを作成します。
#!/bin/bash
sleep 30 &
process_id=$!
echo "PID: $process_id"
wait $process_id
echo "Exit status: $?"
コードを1行ずつ説明しましょう:
- 最初の行はshebangと呼ばれ、ファイルの残りの部分を解析するために使用するインタープリターをオペレーティングシステムに指示します。
-
sleepを使用しています 時間のかかるバックグラウンドプロセスをエミュレートするコマンド。 -
$!バックグラウンドで実行された最後のジョブのPIDを格納する内部Bash変数です。この例では、これがsleepのPIDです。 指図。 PIDを変数(process_id)に保存しています 。 - PID番号を印刷します。
- PIDは
waitに渡されますsleepまで待機するコマンド コマンドが完了します。 -
waitの終了ステータスを出力します 指図。$?最後に実行されたコマンドの終了ステータスを保持する内部Bash変数です。
スクリプトを実行すると、次のように出力されます。
PID: 36353
Exit status: 0
ここに-nを使用した例があります オプション:
#!/bin/bash
sleep 3 &
sleep 30 &
sleep 5 &
wait -n
echo "First job completed."
wait
echo "All jobs completed."
スクリプトが実行されると、3つのバックグラウンドプロセスが生成されます。 wait -n 最初のジョブが完了し、echoステートメントが出力されるまで待機します。 待つコード> すべての子バックグラウンドジョブが完了するのを待ちます。
first job completed
all jobs completed
最後の例では、 -fについて説明しています。 オプション。ターミナルを開いて実行します:
sleep 3600 & [1] 46671
プロセスを待ちます:
wait 46671
別のターミナルを開き、 killでプロセスを停止します コマンド:
kill -STOP 46671
プロセスステータスが変更されると、 wait コマンドが完了し、プロセスの終了コードが返されます。
ここで、同じ手順を繰り返しますが、今回は wait -f $ pidを使用します :
sleep 3600 &wait -f 46671
他の端末からプロセスを停止します:
kill -STOP 46671
今回はwait コマンドは完了しません。 sleepまで実行されます プロセスは終了します。
結論#
wait コマンドは、指定されたジョブが完了するのを待ち、ジョブの終了コードを返します。