linux shell編程多線程和wait命令學習

         最近在使用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

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

發佈了27 篇原創文章 · 獲贊 13 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章