gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:51 25 4
gpt4 key购买 nike

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

最佳答案

将多个并行后台进程的输出合并到一个数组中很棘手,因为这些进程无法轻松访问任何共享内存。我认为最好的方法是构建一个大型管道来同步数据,并使用空值来描述每个进程的输出。启动此类管道的最佳方式是递归。但是,没有任何方法可以将 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[@]}")

关于linux - bash脚本通过循环同时Ping 1000+ ip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44093112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com