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

  

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM