在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
说到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 "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} #参数1表示分割成多少份即,开启多少个线程,默认10个 FILE=${2:-iplist} #参数2表示分割的对象,默认iplist文件 #分割文件 SplitFile $FILE $SPLIT_NUM #循环遍历临时IP文件 for iplist in $(ls ./SplitFile/*) do #循环ping测试临时IP文件中的ip(丢后台) cat $iplist | while read ip do ping -c 4 -w 4 $ip >/dev/null && echo $ip | tee -ai okip.log #ping 可达的IP则写入日志 done & #在while循环后面加上&符号,让这个嵌套循环在后台执行 done 将代码保存为ping.sh之后,执行 sh ping.sh iplist 100 的过程如下: 然后,通过for循环读取这些分割文件,并在后台使用while循环对其中ip执行ping命令。 |
请发表评论