分享一个入门级可控多线程shell脚本方案

说到shell可控多线程,网上分享的大部分是管道控制的方案。这种方案,张戈博客也曾经实战并分享过一次:《Shell+Curl网站健康状态检查脚本,抓出中国博客联盟失联站点》,感兴趣的朋友可以看看。

分享一个入门级可控多线程shell脚本方案

下面张戈博客再分享另一种更容易理解的入门级可控多线程shell脚本方案:任务切割、各个击破。

先来 1 段场景描述:

某日,在鹅厂接到了这个任务,需要在Linux服务器中,对几千个IP进行一次Ping检测,只要取得ping可达的IP就好。如果单个IP去ping测试,虽然也可以完成任务,几千个IP还好了,如果更多呢?

鉴于这个case简单程度,第一时间先放弃了以前用过的管道方案,而是采用了各个击破的思想。

简单思路:

按照任务切割的“战略思想”,我先将这几千IP存入一个iplist文件,然后写一个分割函数,将这个文件分成多份临时IP清单,最后,用多线程遍历这些临时IP文件即可变相实现多线程了。

具体代码:

将代码保存为ping.sh之后,执行  sh ping.sh  iplist 100 的过程如下:

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

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

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

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

发表评论

gravatar

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen:

刷新评论

目前评论:12   其中:访客  10   博主  2

  1. 微部落博客 4 来自天朝的朋友 谷歌浏览器 Windows 7 江苏省常州市 电信

    这个表示看不懂,有了这个技术导航站检查是不是不要人工一个个点着看了啊

    • 张戈 [博主] 来自天朝的朋友 Safari浏览器  Android 4.4.4 M463C Build/KTU84P 广东省广州市 电信

      算是半自动吧

  2. 且听风吟 1 来自天朝的朋友 谷歌浏览器 Windows 7 浙江省杭州市 电信

    哎,没看懂,但是还是不间断的来学习,时间长了,也许会或多或少能学到些东西!

  3. 创意生活 1 来自天朝的朋友 谷歌浏览器 Windows 7 江西省上饶市 电信

    好专业的,不好喷。

  4. 香港vps 2 来自天朝的朋友 谷歌浏览器 Windows 7 重庆市 电信

    博主除了会搞程序还会搞运维方面的东西?好了不起,不得不佩服,永远支持你

  5. harries 3 来自天朝的朋友 谷歌浏览器 Windows 8 北京市 联通

    shell很牛呀

  6. 静思科技 0 来自天朝的朋友 谷歌浏览器 Windows 7 广东省深圳市 电信

    来给看看,也算是见识见了

  7. 季节网 2 来自天朝的朋友 谷歌浏览器 Windows 7 河北省保定市 电信

    好吧,看不懂代码,小白一枚飘过

  8. web前端技术 1 来自天朝的朋友 谷歌浏览器 Windows 7 云南省昆明市 联通

    你的博客导航里的那些死站清理了吗?

  9. 成都川科卫校 3 来自天朝的朋友 QQ浏览器 Windows 7 四川省成都市 联通

    谢谢博主分享的文章。很棒。

  10. 肥仔诚 0 来自天朝的朋友 谷歌浏览器 Windows 8.1 广东省广州市 电信

    张哥,代码有点不太明白…上面写着”#文本分割函数:将文本$1按份数$2进行分割”..但是到了引用函数的地方好像两个参数反过来了…还有一个问题是..如果按照一个文本20行的话..默认分开10份.按照函数的算法num1跟num2的组合分别如下:
    n1=1 n2=3
    n1=4 n2=6
    n1=7 n2=9
    n1=10 n2=12
    n1=13 n2=15
    n1=16 n2=18
    n1=19 n2=21
    好像并不是想象那么完美..我不知道有无理解错您脚本的意思..望回复

    • 张戈 [博主] 来自天朝的朋友 QQ浏览器 Windows 7 广东省广州市 电信

      那个是函数的顺序,确实和脚本整个参数是反的:
      SPLIT_NUM=${1:-10} #参数1表示分割成多少份即,开启多少个线程,默认10个
      FILE=${2:-iplist} #参数2表示分割的对象,默认iplist文件
      #分割文件
      SplitFile $FILE $SPLIT_NUM
      这里是为了我自己方便,因为我们这边iplist是默认的,所以只需要执行 1.sh + 分割的线程数,这里其实也可以用 -f file -t 10 这种模式获取。。。这是偷懒了

      按照你说的,确实不完美、不严谨,可以试下 split -l 10 file.txt 这个来做份数切分,不过当无法整除的时候也是不严谨的

加载中,请稍候...