除了可以使用ansible自动化运维工具判断主机是否在线以外,还可以通过编写Shell脚本来实现。
1、编写脚本
#! /bin/bash
#测试192.168.81.0/24网段中哪些主机处于开机状态,哪些主机处于关机状态
# #方法一:使用for循环判断
# for i in {1..254}
# do
# ping -c 2 $i 0.3 -w 1 192.168.81.$i &>/dev/null
# if [ $? -eq 0 ];
# then
# echo " 192.168.81.81.$i is up"
# else
# echo " 192.168.81.$i is down "
# fi
# done
# #方法二:使用while循环判断
# i=1
# while [ $i -le 254 ]
# do
# ping -c 2 -i 0.3 -w 1 192.168.81.$i &>/dev/null
# if [ $? -eq 0 ]
# then
# echo " 192.168.81.$i is up "
# else
# echo " 192.168.81.$i is down "
# fi
# let i++
# done
#方法三:使用状态(多进程)判断
#自定义一个函数
myping ( ) {
ping -c 2 -i 0.3 -w 1 $1 &>/dev/null
if [ $? -eq 0 ];
then
echo "192.168.81.$1 is up "
else
echo " 192.168.81.$i is down "
fi
}
# $1 是函数的第一个参数,在这表示要传入的IP地址参数
for i in {1..254}
do
myping "$i"
done
2、运行checknetwork.sh脚本
3、总结
通过对比发现,使用which循环判断速度最慢,使用函数的方法判断速度最快。
`while` 循环和 `for` 循环的操作对象都是单个 IP 地址,每次循环都需要进行一次完整的 ICMP 请求及响应过程,速度相对较慢。
而使用函数并发地进行 ICMP 请求,可以同时测试多个 IP 地址的响应情况,从而提高测试速度。同时,使用函数操作也避免了循环时进行相同命令行的重复创建和销毁的过程,使网络延迟减小。
通过并发执行多个 ICMP 请求,可以让测试工作更快地完成。当测试的主机数量很大时,比如超过 1000 台,这种并发的方式会更为明显地展现出它的优势。当然,这种方式需要一些多线程或多进程的技巧来实现,例如使用函数、运行后台进程等等。