分类: 敏捷开发
2013-03-20 11:35:30
在这次工作中涉及到需要接入大量设备进行监控,监控架构为C/S模式。
因此在接入前,我的第一件事为确保需要接入的设备与监控服务器路由可达,测试路由联通性工具,当然是PING了。
处理问题思路-浅:通过发送两次PING包,观察返回值,确认路由是否可达
模块1:ping -c 2 x.x.x.x
循环执行PING
#!/bin/sh
for ip in `cat testlist`
do
ping -c 2 $ip;
done
保存脚本为ping.sh,并执行,且输出执行结果
/bin/sh ping.sh > result
输入效果如下:
PING 10.195.xxx.xxx (10.195.xxx.xxx) 56(84) bytes of data.
64 bytes from 10.195.xxx.xxx: icmp_seq=0 ttl=252 time=1.29 ms
64 bytes from 10.195.xxx.xxx: icmp_seq=1 ttl=252 time=1.19 ms
--- 10.195.xxx.xxx ping statistics ---x
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 1.191/1.243/1.296/0.063 ms, pipe 2
[color=Red]PING 10.238.xxx.xxx (10.238.xxx.xxx) 56(84) bytes of data.
--- 10.238.xxx.xxx ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 999m[/color]s
输出效果分析:从输出文本中的确可以判断路由联通情况,但面对上千行的输出,还需要人眼去识别,效率太低,因此,有没有更智能友善的输出呢?当然有的!
处理问题思路-中:通过以上分析,对代码作以下优化处理
难点:怎样去判断PING结果是可达或不可达?
我的思路(笨办法):通过我对上一程序的输出,我发现当路由不可达时候,PING返回行数只有5行,而路由可达时候,返回行数大于5行,所以这里就可以用返回行数作为判断PING执行结果依据:
代码
#!/bin/sh
for ip in `cat wg_fir_iplists`
do
count=$(ping -c 2 $ip|wc -l); ##赋值时候等号两边不能有空格!!
if [ $count -gt 5 ];then ##if [ ] 字符之间需有空格分割
echo "$ip PASS";
else
echo "$ip LOSS";
fi
done
代码分析:此代码缺陷为PING返回值具有不确定性
新思路(最佳方案):经坛友提醒$? ,?变量表示之前刚执行完成的指令的返回状态,0表示有正常返回值;
#!/bin/sh
for ip in `cat wg_fir_iplists`
do
ping -c 2 $ip > /dev/null; ##输出不显示
if [ $? -eq 0 ];then ##变量?,表示之前刚执行完成的指令的返回状态,0表示有正常返回值;注意IF与方括号之间空格;
echo "$ip PASS";
else
echo "$ip LOSS";
fi
done
代码简化后:
- #!/bin/sh
- for ip in `cat wg_fir_iplists`; do
- ping -c 2 $ip > /dev/null && echo "$ip PASS" || echo "$ip LOSS"
- done
从本次问题的解决过程中,发现SHELL语法有很多灵活的用法,但必须熟悉它,否则走了弯路都不知道,就像我最初使用的笨方法!!!