Linux 中的等待命令示例

Wait 是一個 shell 命令,它等待給定的進程完成,然後返回其退出狀態。 Wait 命令用於等待特定的進程 ID 和作業 ID 並返回它們的終止狀態。

在執行大型自動化流程時,我們需要讓少數模塊等待上一組模塊完成並將數據流水線返回到下一個模塊中,在這種情況下,我們可以使用 Wait 命令直到完成前一個模塊。

等待命令的工作原理

Wait 命令用於監控前一進程,根據前一進程返回狀態返回退出狀態。 為了 example,如果我們想等待完成一個特定的進程ID 13245,那麼當進程13245完成等待命令返回13245退出狀態的返回值時,我們應該使用“wait 13245”。

– 等待 PID(PID – 命令的進程 ID,實用程序將等待終止)。
– 等待JID(JID – 標識要等待的後台進程的作業ID,僅適用於當前shell 執行環境中的wait 調用)。

等待命令的退出狀態值取決於最後指定的 PID/JID。 當任何進程異常終止時,退出狀態將大於 128。

等待命令以值退出 0 當它在沒有子進程的情況下調用並且當前 shell 已知的所有進程 ID 已終止時。 如果 wait 命令檢測到任何錯誤,則返回 1 到 126 之間的任何值。 如果最後一個進程 ID 未知,則 wait 命令以值 127 退出。

等待命令示例

讓我們檢查一些腳本以了解等待命令的工作原理。

示例:1 – 帶有等待命令的腳本

我們有兩個名為“foo.sh”和“bar.sh”的腳本。 ‘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”的腳本。 ‘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 (Exit 狀態 = 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 (Exit 狀態 = 非零)

腳本 – 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
$

結論

Wait 和 Sleep 都是操作系統中基於時間的系統調用。 讓我們檢查一下 wait 和 sleep 命令之間的區別。

等待:當用戶想要停止當前進程並釋放進程持有的所有資源並等待其他進程執行時。 我們需要使用notify讓這個進程知道在其他進程完成後重新開始執行。

Sleep:當用戶想要暫停當前進程一段時間時使用此系統調用。 它保持對資源的鎖定,直到睡眠時間結束並再次開始執行進程。 在這裡,流程在整個執行過程中都有控制權。 例如我執行了一些命令 bash 並且想要休眠一段時間,因為期望執行命令的一些輸出將用於當前進程的進一步執行。