說到shell可控多線程,網(wǎng)上分享的大部分是管道控制的方案。這種方案,張戈博客也曾經(jīng)實戰(zhàn)并分享過一次:《Shell+Curl網(wǎng)站健康狀態(tài)檢查腳本,抓出中國博客聯(lián)盟失聯(lián)站點》,感興趣的朋友可以看看。
分享一個入門級可控多線程shell腳本方案
下面張戈博客再分享另一種更容易理解的入門級可控多線程shell腳本方案:任務(wù)切割、各個擊破。
先來 1 段場景描述:
某日,在鵝廠接到了這個任務(wù),需要在Linux服務(wù)器中,對幾千個IP進(jìn)行一次Ping檢測,只要取得ping可達(dá)的IP就好。如果單個IP去ping測試,雖然也可以完成任務(wù),幾千個IP還好了,如果更多呢?
鑒于這個case簡單程度,第一時間先放棄了以前用過的管道方案,而是采用了各個擊破的思想。
簡單思路:
按照任務(wù)切割的“戰(zhàn)略思想”,我先將這幾千IP存入一個iplist文件,然后寫一個分割函數(shù),將這個文件分成多份臨時IP清單,最后,用多線程遍歷這些臨時IP文件即可變相實現(xiàn)多線程了。
具體代碼:
#!/bin/sh #文本分割函數(shù):將文本$1按份數(shù)$2進(jìn)行分割 SplitFile() { linenum=`wc -l $1 |awk '{print $1}'` if [[ $linenum -le $2 ]] then echo "The lines of this file is less then $2, Are you kidding me..." exit fi Split=`expr $linenum / $2` Num1=1 FileNum=1 test -d SplitFile || mkdir -p SplitFile rm -rf SplitFile/* while [ $Num1 -lt $linenum ] do Num2=`expr $Num1 + $Split` sed -n "${Num1}, ${Num2}p " $1 > SplitFile/$1-$FileNum Num1=`expr $Num2 + 1` FileNum=`expr $FileNum + 1` done } #Define some variables SPLIT_NUM=${1:-10} #參數(shù)1表示分割成多少份即,開啟多少個線程,默認(rèn)10個 FILE=${2:-iplist} #參數(shù)2表示分割的對象,默認(rèn)iplist文件 #分割文件 SplitFile $FILE $SPLIT_NUM #循環(huán)遍歷臨時IP文件 for iplist in $(ls ./SplitFile/*) do #循環(huán)ping測試臨時IP文件中的ip(丟后臺) cat $iplist | while read ip do ping -c 4 -w 4 $ip >/dev/null echo $ip | tee -ai okip.log #ping 可達(dá)的IP則寫入日志 done #在while循環(huán)后面加上符號,讓這個嵌套循環(huán)在后臺執(zhí)行 done
將代碼保存為ping.sh之后,執(zhí)行 sh ping.sh iplist 100 的過程如下:
先將iplist切割成100份,存放在 SplitFile 文件夾中
然后,通過for循環(huán)讀取這些分割文件,并在后臺使用while循環(huán)對其中ip執(zhí)行ping命令。
由于while是丟后臺的, 所以for循環(huán)會一次性執(zhí)行100個while,相當(dāng)于開啟了100個線程,速度自然不可同日而語矣。
其中,切割的份數(shù)即你想要開啟的多線程數(shù)量,很明顯,這種任務(wù)分割的思路雖然沒有管道方案來的高大上,但是其思想更加簡單易懂,而且通用性也更好,適合入門級的簡單多線程任務(wù)。
標(biāo)簽:優(yōu)質(zhì)小號 自貢 武漢 百色 滁州 丹東 鎮(zhèn)江 六盤水
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《分享一個入門級可控多線程shell腳本代碼》,本文關(guān)鍵詞 分享,一個,入門,級,可控,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。