Shell指令碼併發及併發數的控制

2022-05-21 22:30:10 字數 1687 閱讀 3897

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

# !/bin/bash

for i in `seq 1 10`

do echo $i

done

echo "----end----"

指令碼執行的結果如下:

123

4567

8910----end----

echo $1命令序列執行,如果命令耗時較長導致總時間較長。如果命令之間沒有互相依賴關係時,可以讓命令並行執行,並行執行的方法就是在命令後加上&符號。

# !/bin/bash

for i in `seq 1 10`

do echo $i &

done

echo "----end----"

指令碼執行的結果如下:

123

54----end----107

896

可以看到,這樣不能保證命令的執行順序,有的時候需要保證for迴圈所有命令執行完後再向後執行接下來的命令。可以使用 wait 實現

# !/bin/bash

for i in `seq 1 10`

do echo $i &

done

wait

echo "----end----"

指令碼執行的結果如下:

123

69104

578----end----

問題還沒有結束,當需要並行執行的命令數量特別多的時候,特別是執行命令的資源占用較多時,直接用 & 實現並行容易將伺服器資源占用打滿,影響其他程式執行。

使用管道和令牌原理實現併發控制。

#!/bin/bash

# step1 建立有名管道

[ -e ./fd1 ] || mkfifo ./fd1

# 建立檔案描述符,以可讀(<)可寫(>)的方式關聯管道檔案,這時候檔案描述符3就有了有名管道檔案的所有特性

exec 3<> ./fd1

# 關聯後的檔案描述符擁有管道檔案的所有特性,所以這時候管道檔案可以刪除,我們留下檔案描述符來用就可以了

rm -rf ./fd1

# step2 建立令牌

for i in `seq 1 2`;

do # echo 每次輸出乙個換行符,也就是乙個令牌

echo >&3

done

# step3 拿出令牌,進行併發操作

for line in `seq 1 10`;

do read -u3 # read 命令每次讀取一行,也就是拿到乙個令牌

&done

wait

exec 3<&- # 關閉檔案描述符的讀

exec 3>&- # 關閉檔案描述符的寫

shell指令碼的併發

2016年05月09日 17 06 28 閱讀數 1680 default模式下,shell命令是阻塞執行的,可以通過其後新增 讓這條命令非同步執行,如 sleep 10 執行這條命令後,並不會阻塞10秒,而是立即返回。如果將這種方法用在while迴圈中,則可以實現多程序並行處理。例如一下test1...

shell指令碼 迴圈及併發控制

bin bash read p input os version os version if os version 7.3 then cat etc aaa eof 就是講下面的內容寫到 etc aaa中 name cj passwd cj eofelif os version 6.4 then c...

Shell指令碼中的併發

主要記錄一下shell指令碼中的命令的併發和序列執行。預設的情況下,shell指令碼中的命令是序列執行的,必須等到前一條命令執行完後才執行接下來的命令,但是如果我有一大批的的命令需要執行,而且互相又沒有影響的情況下 有影響的話就比較複雜了 那麼就要使用命令的併發執行了。看下面的 bin bash f...