bash脚本通过循环同时Ping 1000+ ip

时间:2017-05-21 04:15:09

标签: linux bash ubuntu

LocationDevice数组包括该位置的所有设备(来自文本文件)

我想要做的是将统计结果保存在PingValue [$ k]数组中,并在下一个循环中将它们打印出来(当然这将是打印之外的其他内容)我想找到要做的事情将声明命令发送到后台,以便1000个设备ping不到10秒(每个设备为-c 5)然后我可以在第二个循环中调用我的阵列处理它们。

我试图回复PingValue[$k]=`ping -c 5 -q ${LocationDevice[$k]}`但是没有工作,数组没有值,所有结果在几秒或几秒后打印

for ((k=0;k<${#LocationDevice[@]};k++)) do
PingValue[$k]=`ping -c 5 -q ${LocationDevice[$k]}`
done
sleep 10
for ((i=0;i<${#LocationDevice[@]};i++)) do
echo "${PingValue[$i]}"          
done

1 个答案:

答案 0 :(得分:1)

将多个并行后台进程的输出组合到一个阵列中非常棘手,因为这些进程无法轻松访问任何共享内存。我认为,最好的方法是构建一个大型管道来同步数据并使用空值来描述每个进程的输出。启动此类管道的最佳方法是递归。但是,没有任何方法可以快速将1000个结果从管道读入最终数组,这需要一段时间。相反,您可以在从管道中读取每个项目时进行处理(在构建阵列时,如果您仍然需要它)。试试这个:

PingHosts() {
        [ "$1" ] || return
        host="$1"; shift
        rest=("$@")
        (
                r=$(ping -c 5 -q "$host")
                echo "$r"
                printf "\0"
                cat
        ) < <(PingHosts "${rest[@]}" &)
}

for ((i=0; i<${#LocationDevice[@]}; ++i)) do
        read -r -d $'\0' pingresult
        PingValue[$i]="$pingresult"

        echo "Processing result for $i:"
        echo "${PingValue[$i]}"
        echo "-----------------------"
done < <(PingHosts "${LocationDevice[@]}")