Waitは、特定のプロセスが完了するのを待ってから、その終了ステータスを返すシェルコマンドです。 Waitコマンドは、特定のプロセスIDとジョブIDのいずれかを待機し、それらの終了ステータスを返すために使用されます。
大きな自動化フローを実行する場合、前のモジュールセットが完了するまで待機し、次のモジュールにパイプライン化されたデータを返すようにいくつかのモジュールを作成する必要があります。この場合、前のモジュールが完了するまでWaitコマンドを使用できます。
待機コマンドのしくみ
前のプロセスを監視するために使用される待機コマンド。前のプロセスの戻りステータスに応じて、終了ステータスを返します。たとえば、特定のプロセスID 13245の完了を待機する場合は、プロセス13245のcompletewaitコマンドが13245の終了ステータスの戻り値を返すときに「wait13245」を使用する必要があります。
-待機PID(PID-ユーティリティが終了を待機するコマンドのプロセスID)。
--wait JID(JID-待機するバックグラウンドプロセスを識別するジョブID。現在のシェル実行環境での待機の呼び出しにのみ適用されます)。
待機コマンドの終了ステータス値は、最後に指定されたPID/JIDによって異なります。プロセスが異常終了すると、終了ステータスは128を超えます。
待機コマンドは値0
で終了します 子プロセスなしで呼び出し、現在のシェルがすべてのプロセスIDを認識している場合、終了します。 waitコマンドがエラーを検出すると、1から126までの値を返します。最後のプロセスIDが不明な場合、waitコマンドは値127で終了します。
待機コマンドの例
いくつかのスクリプトをチェックして、waitコマンドがどのように機能するかを理解しましょう。
例:1 –待機コマンドを使用したスクリプト
'foo.sh'および'bar.sh'スクリプトと呼ばれる2つのスクリプトがあります。 'Foo.sh'スクリプトは1から5までの数字を出力します。'bar.sh'スクリプトはfoo.shを呼び出してバックグラウンドで実行し、foo.shのPIDを取得して完了するのを待ちます。完了すると、 'bar.sh'ループを開始して完了します。
スクリプト– foo.sh
#!/bin/bash
for i in 1 2 3 4 5
do
echo “foo.sh – Looping … number $i”
done
スクリプト– bar.sh
#!/bin/bash
echo “Started bar.sh”
echo “Started foo.sh”
./foo.sh &
pid=$!
wait $pid
echo “Completed foo.sh”
for I in 1 2 3 4 5
do
echo “bar.sh – Looping … number $i”
done
結果
Started bar.sh
Started foo.sh
foo.sh – Looping .. number 1
foo.sh – Looping .. number 2
foo.sh – Looping .. number 3
foo.sh – Looping .. number 4
foo.sh – Looping .. number 5
Completed foo.sh
bar.sh – Looping .. number 1
bar.sh – Looping .. number 2
bar.sh – Looping .. number 3
bar.sh – Looping .. number 4
bar.sh – Looping .. number 5
Completed bar.sh
$
例2 –待機コマンドなしのスクリプト
'foo.sh'および'bar.sh'スクリプトと呼ばれる2つのスクリプトがあります。 'foo.sh'スクリプトは1から5までの数字を出力し、bar.shスクリプトはfoo.shを呼び出してバックグラウンドで実行しますが、foo.shが完了して両方のスクリプトを実行するのを待ちません。
スクリプト– foo.sh
#!/bin/bash
for i in 1 2 3 4 5
do
echo “foo.sh – Looping … number $i”
done
スクリプト– bar.sh
#!/bin/bash
echo “Started bar.sh”
echo “Started foo.sh”
./foo.sh &
echo “Completed foo.sh”
for I in 1 2 3 4 5
do
echo “bar.sh – Looping … number $i”
done
結果
Started bar.sh
Started foo.sh
Completed foo.sh
bar.sh – Looping .. number 1
bar.sh – Looping .. number 2
bar.sh – Looping .. number 3
bar.sh – Looping .. number 4
bar.sh – Looping .. number 5
Completed bar.sh
$
foo.sh – Looping .. number 1
foo.sh – Looping .. number 2
foo.sh – Looping .. number 3
foo.sh – Looping .. number 4
foo.sh – Looping .. number 5
$
例:3 –待機コマンドとリターンステータスを含むスクリプト
'bar.sh'スクリプトは、foo.shを呼び出してバックグラウンドで実行し、foo.shのPIDを取得して完了するのを待ちます。完了すると、bar.shループを開始して完了します。最後に、 foo.shスクリプトの終了コード。
スクリプト– foo.sh(終了ステータス=0)
スクリプト-foo.sh
#!/bin/bash
for i in 1 2 3 4 5
do
echo “foo.sh – Looping … number $i”
done
スクリプト– bar.sh
#!/bin/bash
./foo.sh &
BPID=$!
wait $BPID
stat=$?
if [ $stat –eq 0 ]
then
echo “Exit status - $stat”
else
echo “Exit status - $stat”
fi
結果
foo.sh – Looping .. number 1
foo.sh – Looping .. number 2
foo.sh – Looping .. number 3
foo.sh – Looping .. number 4
foo.sh – Looping .. number 5
Exit status - 0
$
スクリプト– foo.sh(終了ステータス=ゼロ以外)
スクリプト-foo.sh
#!/bin/bash
for i in 1 2 3 4 5
do
iiecho “foo.sh – Looping … number $i”
done
スクリプト– bar.sh
#!/bin/bash
./foo.sh &
BPID=$!
wait $BPID
stat=$?
if [ $stat –eq 0 ]
then
echo “Exit status - $stat”
else
echo “Exit status - $stat”
fi
結果
./foo.sh: line 4: iiecho: command not found
./foo.sh: line 4: iiecho: command not found
./foo.sh: line 4: iiecho: command not found
./foo.sh: line 4: iiecho: command not found
./foo.sh: line 4: iiecho: command not found
Exit status – 127
$
結論
待機とスリープはどちらも、オペレーティングシステムでの時間ベースのシステムコールです。待機コマンドとスリープコマンドの違いを確認しましょう。
待機:ユーザーが現在のプロセスを停止する必要があり、プロセスが保持しているすべてのリソースを解放し、他のプロセスが実行されるのを待機する場合。通知を使用して、他のプロセスの完了時に実行を再開することをこのプロセスに認識させる必要があります。
スリープ:このシステムコールは、ユーザーが現在のプロセスをしばらく停止したい場合に使用されます。スリープ時間が終了するまでリソースのロックを保持し、プロセスの実行を再開します。ここでは、プロセスが実行全体を制御します。たとえば、bashでコマンドを実行し、実行されたコマンドからの出力を期待してしばらくスリープしたいのですが、これは現在のプロセスのさらなる実行に利用されます。