Linux 将bash脚本Ping 1000+;ip同时通过环路

Linux 将bash脚本Ping 1000+;ip同时通过环路,linux,bash,ubuntu,Linux,Bash,Ubuntu,LocationDevice阵列包括该位置中的所有设备(来自文本文件) 我想做的是将统计结果保存在PingValue[$k]数组中,并在下一个循环中打印出来(当然不是打印),我想找到其他方法将声明命令发送到后台,以便1000个设备的Ping发生时间不到10秒(-每个设备5次)然后我在第二个循环中调用我的数组 我试图回显PingValue[$k]=`ping-c5-q${LocationDevice[$k]}`,但没有成功,数组在几秒钟或几秒钟后没有打印出值和所有结果 for ((k=0;k<

LocationDevice阵列包括该位置中的所有设备(来自文本文件)

我想做的是将统计结果保存在PingValue[$k]数组中,并在下一个循环中打印出来(当然不是打印),我想找到其他方法将声明命令发送到后台,以便1000个设备的Ping发生时间不到10秒(-每个设备5次)然后我在第二个循环中调用我的数组

我试图回显
PingValue[$k]=`ping-c5-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

用于((k=0;k将多个并行后台进程的输出组合到一个数组中是很棘手的,因为这些进程无法轻松访问任何共享内存。我认为,最好的方法是构建一个大型管道来同步数据,并使用空值来描述每个进程的输出。启动此类管道的最佳方法是递归的。但是,无法快速将管道中的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[@]}")
PingHosts(){
[“$1”]| |返回
host=“$1”移位
剩余=(“$@”)
(
r=$(ping-c5-q“$host”)
回音“$r”
printf“\0”
猫

)<我编辑了格式,假设这就是你的意思。请检查它是否正确。你可能还想尝试询问serverfault,以获得有关如何高效ping 1000台服务器的建议。刚刚尝试了550台设备的列表。因此发生了几件事1.循环打印所有结果花费了很长时间,10多分钟,我不得不停止l在完成之前,它几乎达到了500。2.进程持续消耗内存,占用了大约11GB,问题是即使在我杀死它之后,内存也没有刷新,11GB仍然显示为在htop中使用。3.服务器运行在一个具有4个CPU和16GB内存的虚拟机上,每个CPU的利用率在30-60%之间,不幸的是,这太高了渴望我们,它消耗了太多的资源,只是pingdevices@JosephFY很可能你的系统无法处理启动500个并行进程的问题。这太极端了。我忘了提及这一点,因为这不是你的问题。那么,即使在sc之后,这些进程仍然保留着内存呢ipt被杀死/完成了?我仍然希望其他人可能有不同的想法这样做,目标是以一种被广泛接受的方式及时ping 5000+个设备!!@JosephFY,嗯,它绝对不应该​ 我已经这样做了。不过我只测试了十几个。明天我会尝试使用更多的数字来看看我得到了什么。但是正如我所说的,无论您如何尝试收集结果,启动数百个并行进程可能都是不可行的。您可能需要一次满足十几个。您是否有机会查看正在运行的内存有问题吗?