zoukankan      html  css  js  c++  java
  • 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}"
    

      

     
  • 相关阅读:
    C++PRIMER 阅读笔记 第三章
    一个for循环打印二维数组
    递归实现数组求和
    strlen 与 sizeof
    call,apply,bind,this
    js 原型继承
    vue 动画
    vuex学习心得
    vue+elementui dropdown 下拉菜单绑定方法
    vue 生命周期一点学习
  • 原文地址:https://www.cnblogs.com/liuyi778/p/12846511.html
Copyright © 2011-2022 走看看