最近在使用shell做一些部署工作,在使用過程中,效率一直不高。想提高效率,經過分析發現,並不是所有操作都是需要串行的,一些操作是可以進行並行操作的。經過學習,shell裏面也是可以進行多線程編程的,而且十分方便,同時,wait命令可以進行shell的多線程同步控制。下面是shell多線程和wait命令的一些學習體會。錯誤之處,還請大家指正。
一、啓動後臺子任務
在執行命令後加&操作符,表示將命令放在子shell中異步執行。可以達到多線程效果。如下,
sleep 10 #等待10秒,再繼續下一操作
sleep 10 & #當前shell不等待,後臺子shell等待
二、wait命令介紹
wait [作業指示或進程號]
1.等待作業號或者進程號制定的進程退出,返回最後一個作業或進程的退出狀態狀態。如果沒有制定參數,則等待所有子進程的退出,其退出狀態爲0.
2.如果是shell中等待使用wait,則不會等待調用函數中子任務。在函數中使用wait,則只等待函數中啓動的後臺子任務。
3.在shell中使用wait命令,相當於高級語言裏的多線程同步。
三、例子
1.使用wait等待所有子任務結束。
#!/bin/bash
sleep 10 &
sleep 5&
wait #等待10秒後,退出
#!/bin/bash
sleep 10 &
sleep 5&
wait $! #$!表示上個子進程的進程號,wait等待一個子進程,等待5秒後,退出
2.在函數中使用wait
#!/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"
輸出結果爲:
fun is begin.timeNum:10
fun is begin.timeNum:20
fun is end.timeNum:10
fun is end.timeNum:20
all is ending
從輸出結果,可以看到,整個腳本,等待了所有子任務的退出