shell中wait命令詳解


wait命令介紹

  wait [作業指示或進程號]

  1.等待作業號或者進程號制定的進程退出,返回最后一個作業或進程的退出狀態狀態。如果沒有制定參數,則等待所有子進程的退出,其退出狀態為0.

  2.如果是shell中等待使用wait,則不會等待調用函數中子任務。在函數中使用wait,則只等待函數中啟動的后台子任務。

  3.在shell中使用wait命令,相當於高級語言里的多線程同步。

  語法

  wait(參數)   使用 wait 是在等待上一批或上一個腳本執行完(即上一個的進程終止),再執行wait之后的命令。

  參數

  進程或作業標示:指定進程號或者作業號。

  實例

  1.使用wait等待所有子任務結束。

  [plain] view plain copy#!/bin/bash

  sleep 10 &

  sleep 5&

  wait #等待10秒后,退出

  [plain] view plain copy#!/bin/bash

  sleep 10 &

  sleep 5&

  wait $! #$!表示上個子進程的進程號,wait等待一個子進程,等待5秒后,退出

  2.在函數中使用wait

  [plain] view plain copy#!/bin/bash

  source ~/.bashrc

  fun(){

  echo "fun is begin.timeNum:$timeNum"

  local timeNum=$1

  sleep $timeNum &

 

  wait #這個只等待wait前面sleep

  echo "fun is end.timeNum:$timeNum"

  }

  fun 10 &

  fun 20 &

  wait #如果fun里面沒有wait,則整個腳本立刻退出,不會等待fun里面的sleep

  echo "all is ending"

  輸出結果為:

  [plain] view plain copyfun is begin.timeNum:10

  fun is begin.timeNum:20

  fun is end.timeNum:10

  fun is end.timeNum:20

  all is ending

  從輸出結果,可以看到,整個腳本,等待了所有子任務的退出

 

#!/bin/bash
for ((i=0;i<5;i++))
do
sleep 3;echo a
done

#運行需要15秒。


#!/bin/bash
for ((i=0;i<5;i++))
do
{
sleep 3;echo a
} &
done
wait

#打開5個子進程並行,運行只需要3秒。
復制代碼

例3:

用管道fifo文件來處理並發,本例轉自https://my.oschina.net/sanpeterguo/blog/133304

本例讓博主學到很多,用到管道,read -u,exec的相關知識,后續博客陸續更新。

復制代碼
#!/bin/bash
#author :  peterguo@tencent.com
#date   :  2013.05.24


#sub process do something
function a_sub_process { 
    echo "processing in pid [$$]"
    sleep 1
}


#創建一個fifo文件
FIFO_FILE=/tmp/$.fifo
mkfifo $FIFO_FILE


#關聯fifo文件和fd6
exec 6<>$FIFO_FILE      # 將fd6指向fifo類型
rm $FIFO_FILE


#最大進程數
PROCESS_NUM=4


#向fd6中輸入$PROCESS_NUM個回車
for ((idx=0;idx<$PROCESS_NUM;idx++));
do
    echo
done >&6 


#處理業務,可以使用while
for ((idx=0;idx<20;idx++));
do
    read -u6  #read -u6命令執行一次,相當於嘗試從fd6中獲取一行,如果獲取不到,則阻塞
    #獲取到了一行后,fd6就少了一行了,開始處理子進程,子進程放在后台執行
    {
      a_sub_process && { 
         echo "sub_process is finished"
      } || {
         echo "sub error"
      }
      #完成后再補充一個回車到fd6中,釋放一個鎖
      echo >&6 # 當進程結束以后,再向fd6中加上一個回車符,即補上了read -u6減去的那個
    } &
done


#關閉fd6
exec 6>&- 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM