原始**如下:
#!/bin/bash
for i in `seq 255`
do ping -c 1 192.168.182.
$i>>/dev/null 2>&1
[ $? -eq 0 ] && echo
done
這個指令碼使用乙個執行緒阻塞執行了255次迴圈,每次迴圈執行一秒,掃瞄完需要用255s,效率是十分低的。
改進如下:
#!/bin/bash
for i in `seq 255`do&
done
wait
用{}把迴圈體括起來,後加乙個&符號,代表每次迴圈都把命令放入後台執行,系統會分配乙個執行緒給這個迴圈,這樣就會同時產生255個執行緒同時執行。
如果指令碼下面還有內容就需要wait等待後台命令執行完畢再繼續往下執行。
wait命令的意思是,等待(wait命令)上面的命令(放入後台的)都執行完畢了再往下執行。因為,一條命令一旦被放入後台後,這條任務就交給了作業系統,shell指令碼會繼續往下執行(也就是說:shell指令碼裡面一旦碰到&符號就只管把它前面的命令放入後台就算完成任務了,具體執行交給作業系統去做,指令碼會繼續往下執行),所以要在這個位置加上wait命令,等待作業系統執行完所有後台命令。使用linux管道檔案特性製作佇列,控制線程數目
有名管道特性:
mkfifo pip 建立命名管道
1.cat < pip(阻塞並等待資料輸入管道)
2.echo 『abc』 > pip(如果沒有讀管道的操作,則阻塞)
可以理解成必須在同一時間有讀管道的操作和寫管道的操作,管道中的資料才能從乙個程序轉移到另乙個程序,利用命名管道的上述特性就可以實現乙個佇列控制了,管道具有存乙個讀乙個,讀完乙個就少乙個,沒有則阻塞,放回的可以重複取,這正是佇列特性,但是問題是當往管道檔案裡面放入乙個資源,沒人取則會阻塞,這樣你永遠也沒辦法往管道裡面同時放入10段內容,解決這個問題的關鍵就是檔案描述符了。
exec 3<>pip,建立檔案描述符3關聯管道檔案,這時候3這個檔案描述符就擁有了管道的所有特性,還具有乙個管道不具有的特性:無限存不阻塞,無限取不阻塞,而不用關心管道內是否為空,也不用關心是否有內容寫入引用檔案描述符, &3可以執行n次echo >&3 往管道裡放入n個資源。
**:
#!/bin/bash
start_time=`date +
%s` #定義指令碼執行的開始時間
[-e pip ]
|| mkfifo pip
exec 3<>pip #定義檔案描述符3,以讀寫方式開啟pip檔案
rm-rf pip #描述符3擁有pip的全部功能,命名管道檔案可以刪除
for j in `seq 30`
doecho>&3 #引用30次檔案描述符3,往管道裡面放入了30個資源
done
for i in `seq 255`
do read -u3 #從管道中讀取乙個資源並執行下面的語句
&done
wait
stop_time=`date +
%s` #定義指令碼執行的結束時間
echo 「time:`expr $stop_time
-$start_time`」
exec 3
#關閉檔案描述符的讀
exec 3>&-
#關閉檔案描述符的讀
兩個for迴圈,第乙個for迴圈30次,相當於向管道中放入了30個資源,
第二個for迴圈255次,read -u3相當於占用乙個資源,{}裡面最後一行**echo >&3相當於一次迴圈執行結束,將資源歸還。
注意:建立乙個檔案描述符exec 3<>pip 不能有空格,代表檔案描述符3有可讀()許可權,注意,開啟的時候可以寫在一起,關閉的時候必須分開關,exec 3&-關閉寫。
理解的還不夠透徹,先做個記錄。
35 Fd和命名管道實現shell併發控制
root localhost code cat multi process test01.sh usr bin bash ping01 for i in do done wait echo all completed.多程序方式併發,返回時間是亂序的。root localhost code cat ...
shell佇列實現執行緒併發控制
請看原文 需求 併發檢測1000臺web伺服器狀態 或者併發為1000臺web伺服器分發檔案等 如何用shell實現?方案一 這應該是大多數人都第一時間想到的方法吧 思路 乙個for迴圈1000次,順序執行1000次任務。bin bash start time date s 定義指令碼執行的開始時間...
Shell流程控制
case迴圈 if condition condition then statements if true 1 elif condition condition then statements if true 2 else statements if all else fails fi注 方括號中的...