天天看點

shell wait 等待指令

shell wait 等待指令

shell wait 等待指令

文章目錄

  • ​​shell wait 等待指令​​
  • ​​1. 簡介​​
  • ​​2. 文法​​
  • ​​3. 示例​​
  • ​​3.1 等待指令​​
  • ​​3.2 單程序等待​​
  • ​​3.3 單程序 bash 等待​​
  • ​​3.4 多個程序等待​​
  • ​​3.5 多個程序 bash 等待 PID​​

1. 簡介

bash wait 指令是一個 Shell 指令,它等待背景運作的程序完成并傳回退出狀态。與等待指定時間的sleep 指令不同,該wait指令等待所有或特定背景任務完成。

2. 文法

在 bash 腳本中使用wait指令有不同的方法。下表解釋了每個用例。

指令 解釋
wait 如果沒有任何參數,該wait指令會等待所有背景程序完成,然後再繼續執行腳本。
wait 添加的 PID 或作業 ID 會等待特定程序結束,然後再繼續執行腳本。
wait -n 僅等待以下背景程序完成并傳回退出狀态。
wait -f 終止程式首先等待背景任務完成後再退出。

3. 示例

3.1 等待指令

在 bash 腳本中使用wait時需要了解三個附加參數:

  • 1.​

    ​&​

    ​​指令後的和号​

    ​( )​

    ​ 表示背景作業。
  • 2.​

    ​$!​

    ​擷取最後一個背景程序的PID。使用多個背景程序時,将先前的 PID 存儲在一個變量中。
  • 3.​

    ​$?​

    ​列印上一個程序的退出狀态。

要檢視這三個參數如何協同工作,請打開終端視窗并運作:

sleep 10 &
echo $!
echo $?      
shell wait 等待指令

該​

​$!​

​​參數存儲背景程序PID,同時​

​$?​

​存儲退出狀态。退出狀态0表示指令成功完成。

3.2 單程序等待

  1. 首先打開終端并建立一個簡單的背景程序:
sleep 10 &      
  1. 确認作業在背景運作:
jobs      
  1. 使用wait不帶任何參數的指令暫停直到程序完成:
wait      
shell wait 等待指令
shell wait 等待指令

10 秒後(由于sleep 10),控制台列印完成消息。

3.3 單程序 bash 等待

使用該wait指令訓示背景程序必須在腳本内執行的時間點。

  1. 例如,在文本編輯器中添加以下代碼:
#!/bin/bash
echo Background process &
echo First message
echo Second message
wait
echo      

如果背景程序沒有完成第一個和第二個程序,則該wait指令調用暫停以等待第二個程序之後背景程序完成,然後再繼續執行第三個程序。

  1. 将腳本另存為​

    ​single_process.sh​

    ​。在終端中,更改權限以使腳本可執行:
sudo chmod      
  1. 運作腳本:
./single_process.sh      
shell wait 等待指令

背景程序在指令之前的任何時間完成​

​wait​

​,并且腳本繼續。

3.4 多個程序等待

1.打開文本編輯器,添加以下多程序腳本:

#!/bin/bash
sleep 10 &
sleep 15 &
sleep 5 &
echo $(date +%T)
wait 
echo $(date +%T)      

wait該腳本在指令之前和之後列印目前時間。沒有任何參數,程式會等待所有程序完成。

  1. 将腳本另存為test.sh并關閉檔案。接下來,使腳本可執行:
sudo chmod      
  1. 最後,運作程式:
./test.sh      
shell wait 等待指令

由于程序在背景運作,所有三個程序都在十五秒内完成。

  1. 使用相同的腳本測試以下用例:
  • 将​

    ​-n​

    ​​參數添加到​

    ​<strong>wait</strong>​

    ​. 隻有最快的過程完成,腳本在十秒後結束。
  • 添加作業 ID 以訓示腳本應等待哪個作業。例如,​

    ​wait %1​

    ​暫停以等待程序 1 ( sleep 10) 完成。

3.5 多個程序 bash 等待 PID

  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 $?"      
  1. 将腳本另存為multi_wait.sh。使腳本可執行:
sudo chmod      
  1. 運作腳本檢視輸出:
./multi_wait.sh      
shell wait 等待指令
  • ​​Bash wait Command with Examples​​

繼續閱讀