一、目的

解决Shell脚本单线程下效率低下的问题

二、适用场景

需要在Linux系统执行同一项命令,但是针对不同的对象,例如PING检测主机,当然可以延展,只要是命令之间不会产生冲突就可以了

三、场景模拟

3.1、我为啥写这个?

学习这个东西的原因是因为朋友需要对多达几百个IP进行Telnet检测,然后询问我能不能写脚本实现,一开始我没考虑太多,直接开始写,脚本内容如下:

#!/bin/bash
##tenlnet扫描
if [ -f "/usr/bin/nc" ];then
echo '开始检测'
else
if [ ! -f "/usr/bin/apt" ];then
apt-get install -y nc
else
if [ -f "/usr/bin/dnf" ];then
dnf install -y nc
else
if [ -f "/usr/bin/yum" ];then
yum install -y nc
else
echo "请自己安装nc"
fi
fi
fi
fi
rm -f disables.txt ips.txt
read -p "请输入IP列表文件路径" File
if [[ -f "$File" ]];then
echo -e "正在获取IP列表"
else
echo "找不到这个文件"
exit 22
fi
read -p "请输入端口,多个请使用空格分开" Drop
ips=`cat $File | wc -l`
echo "一共有 ${ips}"
for((i=1;i<=${ips};i++));do
ip=`cat $File | awk "NR==$i{print }"`
echo -e "正在检测${ip}"
for d in $Drop;do
services="$ip $d"
nc -v -z $services
if [[ "$?" == "0" ]];then
echo -e "$services" >> ips.txt
else
echo "$services" >> disables.txt
fi
done
done
echo "开启的IP列表在 ips.txt"
echo "没有开启的IP列表在disables.txt"

后来发现虽然能实现检测,但是效率太低了,于是就想到Python的多线程处理,然后就去百度一下Shell的多线程,结果真的有方法实现“多线程”,下面开始安排多线程检测IP通讯的脚本(Telnet还没写)。

3.2、多种方式实现“多线程”

3.2.1、第一个方案:命令后台运行+wait命令

之所以第一个写这个方案,是因为我现在只理解这个,其他的方法还在研究中,下面先附上脚本内容吧

#!/bin/bash
# 设置并发的进程数
#echo "请输入线程数"
#read s
rm -f ips.txt disables.txt
read -p "请输入IP列表文件路径" File
if [[ -f "$File" ]];then
echo -e "正在获取IP列表"
else
echo "找不到这个文件"
exit 22
fi
ips=`cat $File | wc -l`
echo -e "当前文件存在${ips}个IP地址"
for((i=1;i<=${ips};i++));do
{
ip=`cat $File | awk "NR==$i{print }"`
sleep 5
ping $ip -c 5 >/dev/null
if [[ "$?" == "0" ]];then
echo -e "$ip" >> ips.txt
else
echo "$ip" >> disables.txt
fi
} &
done
wait
connects=`cat ips.txt | wc -l`
disconnects=`cat disables.txt | wc -l`
echo -e "完成\n存活IP已记录到: ips.txt\n未使用[也可能禁PING]的已记录到:disables.txt"
echo "当前可PING通的IP有: ${connects}"
echo "当前不可PING通的IP有: ${disconnects}"

  

 

Shell简单实现多线程的更多相关文章

  1. 一个简单的多线程Python爬虫(一)

    一个简单的多线程Python爬虫 最近想要抓取拉勾网的数据,最开始是使用Scrapy的,但是遇到了下面两个问题: 前端页面是用JS模板引擎生成的 接口主要是用POST提交参数的 目前不会处理使用JS模 ...

  2. CreateThread简单那多线程编程

    CreateThread简单那多线程编程 作者:vpoet mail:vpoet_sir@163.com 在进行多任务处理的时候我们往往会用到多线程技术,多线程理论上是多个线程同事处理不同的工作,但是 ...

  3. Java Tread多线程(0)一个简单的多线程实例

    作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39341887 本文演示,一个简单的多线程实例,并简单分析一下线程. 编程多 ...

  4. C# 防止同时调用=========使用读写锁三行代码简单解决多线程并发的问题

    http://www.jb51.net/article/99718.htm     本文主要介绍了C#使用读写锁三行代码简单解决多线程并发写入文件时提示"文件正在由另一进程使用,因此该进程无 ...

  5. shell脚本的多线程

    shell脚本的多线程 #!/bin/bash ###这是个多线程脚本!!!! ..} do { .$i >/dev/null ];then echo "192.168.2.$i 存活 ...

  6. Qt5.9一个简单的多线程实例(类QThread)(第一种方法)

    Qt开启多线程,主要用到类QThread.有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run().当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程 ...

  7. Linux学习之常用网络通信命令与shell简单应用技巧(四)

    (一)常用网络通信命令 (1)ping命令 (2)write命令 (3)wall命令 (4)ifconfig命令 (5)shutdown命令 (6)reboot命令 (二)shell简单应用技巧 (1 ...

  8. Linux shell ${}简单用法

    转自:Linux shell ${}简单用法 为了完整起见,我这里再用一些例子加以说明 ${ } 的一些特异功能:假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.t ...

  9. 演练:使用VS2010 C# 创作简单的多线程组件

    BackgroundWorker 组件取代了 System.Threading 命名空间并添加了功能:但是,可以选择保留 System.Threading 命名空间以实现向后兼容并供将来使用.有关更多 ...

随机推荐

  1. 【Java】关键字 和 保留字

    Java的关键字[Keyword]和 保留字[Reserved word] 官方描述: https://docs.oracle.com/javase/tutorial/java/nutsandbolt ...

  2. Geber文件,装配图,BOM表的输出

    一.Geber文件的输出步骤: 注:选择需要导出的层 注:所指箭头的地方都多加个零,让输出有更大的空间来容纳 总结:这就是最终的Geber文件了 二.NC   Drill file的输出: 三.IPC ...

  3. L21 Momentum RMSProp等优化方法

    airfoil4755 下载 链接:https://pan.baidu.com/s/1YEtNjJ0_G9eeH6A6vHXhnA 提取码:dwjq 11.6 Momentum 在 Section 1 ...

  4. ASE课程总结 by 冯晓云

    开始的开始,采访往届ASE班的blog:http://www.cnblogs.com/legs/p/4894362.html 和北航软工M1检查:http://www.cnblogs.com/legs ...

  5. vue组件之间值传递四种方法汇总

    1.父组件获取子组件的数据和方法 $refs 子组件: <template> <div class="header"> <h3>{{ zz }} ...

  6. [GitHub] 75+的 C# 数据结构和算法实现

    C#中标准数据结构和算法的即插即用类库项目 GitHub:https://github.com/aalhour/C-Sharp-Algorithms Watch: 307 Star: 3.4k For ...

  7. CSS 中的伪类和伪元素

    伪类(Pseudo classes) 由于状态的变化是非静态的,所以元素达到一个特定状态时,它可能得到一个伪类的样式:当状态改变时,它又会失去这个样式.由此可以看出,它的功能和 class 有些类似, ...

  8. redis: List列表类型(四)

    list设置值(头部):lpush list one list设置值(尾部):**rpush ** list one list获取值:lrange list 0 -1 list获取指定范围的值:lra ...

  9. python机器学习的常用算法

    Python机器学习 学习意味着通过学习或经验获得知识或技能.基于此,我们可以定义机器学习(ML)如下 - 它可以被定义为计算机科学领域,更具体地说是人工智能的应用,其为计算机系统提供了学习数据和从经 ...

  10. JavaScript--'data-'的用法(1)

    HTML5为我们提供了一个强大的功能,前段也也能实现后台数据库的效果,例如data-xxx <a href="#myModal" data-industry_id=" ...