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>&-