Shell简单实现多线程

 

 

一、目的

解决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 "完成
存活IP已记录到: ips.txt
未使用[也可能禁PING]的已记录到:disables.txt"
echo  "当前可PING通的IP有: ${connects}"
echo  "当前不可PING通的IP有: ${disconnects}"

  

 
原文地址:https://www.cnblogs.com/liuyi778/p/12846511.html