濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > 分享一個(gè)入門(mén)級(jí)可控多線程shell腳本代碼

分享一個(gè)入門(mén)級(jí)可控多線程shell腳本代碼

熱門(mén)標(biāo)簽:百度地圖標(biāo)注直線距離 天津電話外呼系統(tǒng)排名 智能電銷(xiāo)機(jī)器人有用嗎 德陽(yáng)400電話申請(qǐng) 怎么在百度地圖標(biāo)注公司的位置 鶴崗400電話申請(qǐng) 商機(jī)地圖標(biāo)注 測(cè)繪地圖標(biāo)注名稱 外呼電話系統(tǒng)怎么操作

說(shuō)到shell可控多線程,網(wǎng)上分享的大部分是管道控制的方案。這種方案,張戈博客也曾經(jīng)實(shí)戰(zhàn)并分享過(guò)一次:《Shell+Curl網(wǎng)站健康狀態(tài)檢查腳本,抓出中國(guó)博客聯(lián)盟失聯(lián)站點(diǎn)》,感興趣的朋友可以看看。

分享一個(gè)入門(mén)級(jí)可控多線程shell腳本方案

下面張戈博客再分享另一種更容易理解的入門(mén)級(jí)可控多線程shell腳本方案:任務(wù)切割、各個(gè)擊破。

先來(lái) 1 段場(chǎng)景描述:

某日,在鵝廠接到了這個(gè)任務(wù),需要在Linux服務(wù)器中,對(duì)幾千個(gè)IP進(jìn)行一次Ping檢測(cè),只要取得ping可達(dá)的IP就好。如果單個(gè)IP去ping測(cè)試,雖然也可以完成任務(wù),幾千個(gè)IP還好了,如果更多呢?

鑒于這個(gè)case簡(jiǎn)單程度,第一時(shí)間先放棄了以前用過(guò)的管道方案,而是采用了各個(gè)擊破的思想。

簡(jiǎn)單思路:

按照任務(wù)切割的“戰(zhàn)略思想”,我先將這幾千IP存入一個(gè)iplist文件,然后寫(xiě)一個(gè)分割函數(shù),將這個(gè)文件分成多份臨時(shí)IP清單,最后,用多線程遍歷這些臨時(shí)IP文件即可變相實(shí)現(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表示分割成多少份即,開(kāi)啟多少個(gè)線程,默認(rèn)10個(gè)
FILE=${2:-iplist} #參數(shù)2表示分割的對(duì)象,默認(rèn)iplist文件
 
#分割文件
SplitFile $FILE $SPLIT_NUM
 
#循環(huán)遍歷臨時(shí)IP文件
for iplist in $(ls ./SplitFile/*)
do
 #循環(huán)ping測(cè)試臨時(shí)IP文件中的ip(丟后臺(tái))
 cat $iplist | while read ip
 do
 ping -c 4 -w 4 $ip >/dev/null  echo $ip | tee -ai okip.log #ping 可達(dá)的IP則寫(xiě)入日志
 done  #在while循環(huán)后面加上符號(hào),讓這個(gè)嵌套循環(huán)在后臺(tái)執(zhí)行
done

將代碼保存為ping.sh之后,執(zhí)行 sh ping.sh iplist 100 的過(guò)程如下:
先將iplist切割成100份,存放在 SplitFile 文件夾中

然后,通過(guò)for循環(huán)讀取這些分割文件,并在后臺(tái)使用while循環(huán)對(duì)其中ip執(zhí)行ping命令。
由于while是丟后臺(tái)的, 所以for循環(huán)會(huì)一次性執(zhí)行100個(gè)while,相當(dāng)于開(kāi)啟了100個(gè)線程,速度自然不可同日而語(yǔ)矣。
其中,切割的份數(shù)即你想要開(kāi)啟的多線程數(shù)量,很明顯,這種任務(wù)分割的思路雖然沒(méi)有管道方案來(lái)的高大上,但是其思想更加簡(jiǎn)單易懂,而且通用性也更好,適合入門(mén)級(jí)的簡(jiǎn)單多線程任務(wù)。

您可能感興趣的文章:
  • 一篇教會(huì)你寫(xiě)90%的shell腳本(入門(mén)小結(jié))
  • linux shell(.sh)腳本編寫(xiě)和運(yùn)行入門(mén)
  • Shell腳本編程30分鐘入門(mén)(小結(jié))
  • Linux Shell 腳本編程入門(mén)教程
  • Linux Shell腳本系列教程(一):Shell入門(mén)
  • linux Shell入門(mén):掌握Linux,OS X,Unix的Shell環(huán)境
  • 3000字掃盲shell基礎(chǔ)知識(shí)(新手必備)

標(biāo)簽:優(yōu)質(zhì)小號(hào) 自貢 武漢 百色 滁州 丹東 鎮(zhèn)江 六盤(pán)水

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《分享一個(gè)入門(mén)級(jí)可控多線程shell腳本代碼》,本文關(guān)鍵詞  分享,一個(gè),入門(mén),級(jí),可控,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《分享一個(gè)入門(mén)級(jí)可控多線程shell腳本代碼》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于分享一個(gè)入門(mén)級(jí)可控多線程shell腳本代碼的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    武鸣县| 吉首市| 眉山市| 山阴县| 兴业县| 灯塔市| 桂东县| 汶上县| 西宁市| 都匀市| 邓州市| 阳谷县| 永丰县| 阿城市| 鄂温| 浮梁县| 黔东| 卢氏县| 故城县| 忻城县| 七台河市| 丘北县| 万全县| 珲春市| 台前县| 怀柔区| 加查县| 锦屏县| 霍山县| 黑河市| 海城市| 龙口市| 黑龙江省| 桐柏县| 香河县| 比如县| 绍兴县| 绥中县| 漯河市| 武胜县| 白城市|