分享一个入门级可控多线程shell脚本代码
说到shell可控多线程,网上分享的大部分是管道控制的方案。这种方案,张戈博客也曾经实战并分享过一次:《Shell+Curl网站健康状态检查脚本,抓出中国博客联盟失联站点》,感兴趣的朋友可以看看。
分享一个入门级可控多线程shell脚本方案
下面张戈博客再分享另一种更容易理解的入门级可控多线程shell脚本方案:任务切割、各个击破。
先来1段场景描述:
某日,在鹅厂接到了这个任务,需要在Linux服务器中,对几千个IP进行一次Ping检测,只要取得ping可达的IP就好。如果单个IP去ping测试,虽然也可以完成任务,几千个IP还好了,如果更多呢?
鉴于这个case简单程度,第一时间先放弃了以前用过的管道方案,而是采用了各个击破的思想。
简单思路:
按照任务切割的“战略思想”,我先将这几千IP存入一个iplist文件,然后写一个分割函数,将这个文件分成多份临时IP清单,最后,用多线程遍历这些临时IP文件即可变相实现多线程了。
具体代码:
#!/bin/sh
#文本分割函数:将文本$1按份数$2进行分割
SplitFile()
{
linenum=`wc-l$1|awk'{print$1}'`
if[[$linenum-le$2]]
then
echo"Thelinesofthisfileislessthen$2,Areyoukiddingme..."
exit
fi
Split=`expr$linenum/$2`
Num1=1
FileNum=1
test-dSplitFile||mkdir-pSplitFile
rm-rfSplitFile/*
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
}
#Definesomevariables
SPLIT_NUM=${1:-10}#参数1表示分割成多少份即,开启多少个线程,默认10个
FILE=${2:-iplist}#参数2表示分割的对象,默认iplist文件
#分割文件
SplitFile$FILE$SPLIT_NUM
#循环遍历临时IP文件
foriplistin$(ls./SplitFile/*)
do
#循环ping测试临时IP文件中的ip(丢后台)
cat$iplist|whilereadip
do
ping-c4-w4$ip>/dev/null&&echo$ip|tee-aiokip.log#ping可达的IP则写入日志
done&#在while循环后面加上&符号,让这个嵌套循环在后台执行
done
将代码保存为ping.sh之后,执行shping.shiplist100的过程如下:
先将iplist切割成100份,存放在SplitFile文件夹中
然后,通过for循环读取这些分割文件,并在后台使用while循环对其中ip执行ping命令。
由于while是丢后台的,所以for循环会一次性执行100个while,相当于开启了100个线程,速度自然不可同日而语矣。
其中,切割的份数即你想要开启的多线程数量,很明显,这种任务分割的思路虽然没有管道方案来的高大上,但是其思想更加简单易懂,而且通用性也更好,适合入门级的简单多线程任务。