分享一个入门级可控多线程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 "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 的过程如下:

先将 iplist 切割成 100 份,存放在 SplitFile 文件夹中

然后,通过 for 循环读取这些分割文件,并在后台使用 while 循环对其中 ip 执行 ping 命令。

由于 while 是丢后台的, 所以 for 循环会一次性执行 100 个 while,相当于开启了 100 个线程,速度自然不可同日而语矣。

其中,切割的份数即你想要开启的多线程数量,很明显,这种任务分割的思路虽然没有管道方案来的高大上,但是其思想更加简单易懂,而且通用性也更好,适合入门级的简单多线程任务。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇