命名管道Shell併發執行緒控制

2021-09-27 21:59:46 字數 2216 閱讀 2066

原始**如下:

#!/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注 方括號中的...