Linux Shell指令碼中的多工併發執行

2021-10-23 02:41:10 字數 2686 閱讀 8038

實現乙個指令碼能夠使用ping檢測網路的連通性

可以同時檢測多個ip位址, 並且將檢測結果輸出

正常情況下,shell指令碼中的命令是序列執行的,當一條命令執行完才會執行接下來的命令。例如:

#!/bin/bash

for i in;do

echo

$idone

echo

"end"

結果如下:

123

4567

8910end

可見,迴圈體中的「echo $i」命令是序列執行的。但是如果所執行的命令耗時比較長,這就會導致整個程式的執行時間非常長,甚至可能導致程式執行時卡住而失去響應。

#!/bin/bash

for i in;do

ip="192.168.0.$i"

ping -c 2 $ip

&> /dev/null &&

echo

$ip is up

done

從邏輯上看,這個指令碼沒有問題,但是由於要對網路中的多個ip位址輪流執行ping命令,在執行後耗時將非常長,而且此時的指令碼無法使用ctrl+c強制終止,只能使用ctrl+z轉入後台,然後再用kill命令強制結束程序。

[root@localhost ~]

# bash pinghost.sh

192.168.0.65 is up

192.168.0.66 is up

^c^z

[1]+ 已停止 bash pinghost.sh

[root@localhost ~]

# jobs -l #檢視後台工作任務

[1]+ 12496 停止 bash pinghost.sh

[root@localhost ~]

# kill -9 12496 #強制結束程序

[root@localhost ~]

# [1]+ 已殺死 bash pinghost.sh

實際上,在這個指令碼中所迴圈執行的ping命令之間並沒有依賴關係,也就是說不必非要等到「ping 192.168.0.65」結束之後才能接著執行「ping 192.168.0.66」,所有的這些ping命令完全可以併發執行

如果是使用python,則可以借助於多執行緒技術來實現命令的併發執行,而shell不支援多執行緒,因此只能採用多程序的方式。具體的實現方法就是在要併發執行的命令後面加上「&」,將其轉入後台執行,這樣就可以在執行完一條命令之後,不必等待其執行結束,就立即轉去執行下一條命令。修改後的**如下:

#!/bin/bash

for i in;do

echo$i&

done

echo

"end"

執行結果如下:

123

48end5106

9

可見,在併發執行時不能保證命令的執行順序,而且本應在整個迴圈執行結束之後再執行的echo "end"命令,卻在程式一開始就被執行了。所以在併發執行時,我們通常都需要保證在迴圈體中的所有命令都執行完後再向後執行接下來的命令,這時就可以使用 wait命令來實現

在shell中使用wait命令,相當於其它高階語言裡的多執行緒同步。修改**如下:

#!/bin/bash

for i in;do

echo$i&

done

wait

echo

"end"

此時的執行結果如下:

123

4586

9710end

這樣執行結果就正常了。

回到我們的問題上來,如果要檢測多個ip的網路連通性,也可以使用上述過程的思路,**如下:

#!/bin/bash

for i in;do

ip="192.168.0.$i"

ping -c 2 $ip

&> /dev/null &&

echo

$ip is up &

done

wait

網路的檢測結果如下:

[root@localhost ~]

# bash pinghost.sh

192.168.0.65 is up

192.168.0.66 is up

192.168.0.72 is up

192.168.0.73 is up

192.168.0.67 is up

192.168.0.68 is up

因此,當在迴圈執行的命令之間沒有依賴關係時,完全可以採用併發執行的方式,這樣可以大幅提高**執行效率。

當然,併發執行也有缺陷,就是當需要並行執行的命令數量特別多,特別是所執行的命令占用的系統資源非常多時,可能會將整個系統的資源全部耗盡,影響其它程式的執行,因此還可以借助其它技術來限制併發執行的程序數量。

Linux shell指令碼(編輯中)

shell是乙個程式,是使用者和linux核心溝通的橋梁 bin bash 其中 不是注釋,而是告訴作業系統將執行此指令碼所用的直譯器的名字。syntax on set hlsearch set tabstop 4 set autoindent 可以去掉冒號,新增到 vimrc中 bin bash ...

Linux shell指令碼中shift的用法說明

原文 shift命令用於對引數的移動 左移 通常用於在不知道傳入引數個數的情況下依次遍歷每個引數然後進行相應處理 常見於linux中各種程式的啟動指令碼 示例1 依次讀取輸入的引數並列印引數個數 run.sh bin bash while 0 do echo 第乙個引數為 1,引數個數為 shift...

Linux shell指令碼中if判斷的條件

基本上和其他指令碼語言一樣。沒有太大區別。不過值得注意的是。裡面的條件判斷。1.字串判斷str1 str2 當兩個串有相同內容 長度時為真 str1 str2 當串str1和str2不等時為真 n str1 當串的長度大於0時為真 串非空 z str1 當串的長度為0時為真 空串 str1 當串st...