一、目的

解决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}"

  

 

最新文章

  1. [c++] Smart Pointers
  2. javascript高级程序设计阅读笔记(一)
  3. Android判断当前线程是否是主线程的方法
  4. Linux 硬盘分区、分区、删除分区、格式化、挂载、卸载
  5. Linux同步机制 - 基本概念(死锁,活锁,饿死,优先级反转,护航现象)
  6. Android ndk下用AssetManager读取assets的资源
  7. SGU 133.Border
  8. 如何使用cocos2dx-jsbinding 来处理分辨率适配
  9. 原生sql语句执行
  10. find系列之xargs命令
  11. Tyvj-超级书架
  12. Hibernate基本原理
  13. 关于CSS 的position定位问题
  14. Abp后台工作者类使用hangfire
  15. IntelliJ IDEA如何设置头注释,自定义author和date
  16. poj-1207 THE 3n+1 problem
  17. WebService(1-1)webservice调用
  18. Centos7关闭防火墙
  19. word2010自定义的多级列表编号变成黑块的解决办法
  20. 写一个栈,实现出栈、入栈、求最小值,时间复杂度为O(1)

热门文章

  1. docker 安装vim和yum命令
  2. 墨者学院靶场:uWSGI(CVE-2018-7490)路径遍历漏洞复现
  3. animation-play-state 在 ios 中不生效的解决办法(JS篇)
  4. 带你五分钟了解python的函数式编程与闭包
  5. 1/13 update
  6. Flask接口开发过程中的心得2019.10.03
  7. file_put_contens小trick
  8. python里的内置函数你知道有多少个吗?
  9. webpack之Loader
  10. ArangoDB 3.5:流事务API、搜索性能大幅提升、最短路径功能