Chinaunix首页 | 论坛 | 博客
  • 博客访问: 51807
  • 博文数量: 7
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 188
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-20 09:44
个人简介

学贵于专!

文章分类

全部博文(7)

文章存档

2013年(7)

我的朋友

分类: 敏捷开发

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
代码简化后:
  1. #!/bin/sh
  2. for  ip in `cat wg_fir_iplists`; do
  3.     ping -c 2  $ip > /dev/null && echo "$ip PASS" || echo "$ip LOSS"
  4. done

从本次问题的解决过程中,发现SHELL语法有很多灵活的用法,但必须熟悉它,否则走了弯路都不知道,就像我最初使用的笨方法!!!



阅读(5560) | 评论(0) | 转发(1) |
3

上一篇:没有了

下一篇:linux shell if语句使用方法

给主人留下些什么吧!~~