GNU/Linux >> Linux の 問題 >  >> Linux

Bash待機コマンド

待つ 指定されたジョブが完了するのを待機し、待機中のコマンドの終了ステータスを返すコマンドです。

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行ずつ説明しましょう:

  1. 最初の行はshebangと呼ばれ、ファイルの残りの部分を解析するために使用するインタープリターをオペレーティングシステムに指示します。
  2. sleepを使用しています 時間のかかるバックグラウンドプロセスをエミュレートするコマンド。
  3. $! バックグラウンドで実行された最後のジョブのPIDを格納する内部Bash変数です。この例では、これが sleepのPIDです。 指図。 PIDを変数( process_id )に保存しています 。
  4. PID番号を印刷します。
  5. PIDはwaitに渡されます sleepまで待機するコマンド コマンドが完了します。
  6. 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 コマンドは、指定されたジョブが完了するのを待ち、ジョブの終了コードを返します。


Linux
  1. Bash:タイムアウトで待機

  2. bash エクスポート コマンド

  3. jenkins パイプラインで bash コマンドを実行する

  1. Bashの「評価」コマンド?

  2. bash から apachectl を起動する

  3. 単一行の場合はバッシュ

  1. 例を使用したBash待機コマンド

  2. bash sh - コマンドが見つかりません

  3. Bash - 日付コマンドとスペース