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

