【题目要求】
设计一个脚本,监控远程的一台机器(假设ip为192.168.239.150)的存活状态,当发现宕机时发一封邮件给你自己。
提示:
1、你可以使用ping命令 ping -c10 192.168.239.150
2、发邮件脚本可以参考 https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D22Z/mail.py
3、脚本可以搞成死循环,每隔30s检测一次
【习题分析】
对于这种监控类的脚本,套路就一个,设定一个标准阈值,然后通过一些手段获取到要监控目标的属性值。再拿这个属性值和标准阙值进行比较,如果不正常就要做出相应动作,或发邮件,或执行某个命令。
本题是要监控一个 IP 的存活状态,题目中给的建议是使用 ping 命令,所以不妨先运行一下这个命令,看看输出结果是什么
[root@evan-01 ~]# ping -c10 192.168.239.150
PING 192.168.239.150 (192.168.239.150) 56(84) bytes of data.
64 bytes from 192.168.239.150: icmp_seq=1 ttl=64 time=0.031 ms
64 bytes from 192.168.239.150: icmp_seq=2 ttl=64 time=0.020 ms
64 bytes from 192.168.239.150: icmp_seq=3 ttl=64 time=0.036 ms
64 bytes from 192.168.239.150: icmp_seq=4 ttl=64 time=0.036 ms
64 bytes from 192.168.239.150: icmp_seq=5 ttl=64 time=0.034 ms
64 bytes from 192.168.239.150: icmp_seq=6 ttl=64 time=0.037 ms
64 bytes from 192.168.239.150: icmp_seq=7 ttl=64 time=0.033 ms
64 bytes from 192.168.239.150: icmp_seq=8 ttl=64 time=0.035 ms
64 bytes from 192.168.239.150: icmp_seq=9 ttl=64 time=0.034 ms
64 bytes from 192.168.239.150: icmp_seq=10 ttl=64 time=0.035 ms
--- 192.168.239.150 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 8999ms
rtt min/avg/max/mdev = 0.020/0.033/0.037/0.005 ms
[root@evan-01 ~]#
看到上面的结果,应该把重点放到最后面的两行,其中 “0% packet loss” 是一个总结性的输出,字面意思就是说丢包率为 0%,所以我们就可以拿这个丢包率来说事儿。如果不存活了,那这个丢包率就是 100%,但实际网络环境中只要丢包率超过 20%,就会有很大的问题。由此,就可以把标准阙值设置为 20。
剩下来的事情,就是如何把丢包率的那个数字给获取到。至于发邮件的脚本,不是本题关心的内容,可以拿来先用。
【参考答案】
#!/bin/bash
ip=192.168.239.150
email=test@139.com
while 1
do
n=`ping -c10 $ip 2>/dev/null | grep 'received'|awk -F 'received, |%' '{print $2}'`
if [ -z "$n"]
then
echo "There is sth wrong in the script."
exit
fi
if [ $n -ge 20]
then
python /usr/local/sbin/mail.py $email "$ip down" "$ip is down"
#假设 mail.py 已经编写并设置好了
fi
sleep 30
done
【答案解析】
1、本题中如何截取到那个丢包率的数字是关键所在
2、在 ping 命令后面加一个 2>/dev/null 目的是为了把错误信息输出到 /dev/null,在 linux 里,这个文件就是一个黑洞设备,无论写多少东西进去都写不满。总之这样在脚本运行时就不会输出乱七八糟的错误信息
3、如果理解不了 ping -c10 $ip 2>/dev/null | grep 'received'|awk -F 'received, |%' '{print $2}'
,可以从左至右依次执行每一个管道符左侧的命令,这里有一个小技巧,awk -F 后面指定的分隔符是一个复杂用法,如果看不懂这个,那我们写个简单的,如下:
awk -F ':|#|.'
它的意思是分隔符可以是":"
,也可以是"#"
,也可以是"."
,多个分隔符用竖线"|"
来划分。
回到本例,分隔符是'received, '
也可以是'%'
,所以字符串中无论哪个分割符出现,都是同等效果的,而我们要的数字就在第二段。简单点说,就是截取'received, '
和'%'
之间的内容
4、在本例中,把丢包率的数字赋值给变量 n,但变量 n 是否被成功赋值,是需要做一个检测的,如果不能成功赋值,那后续的一系列操作都会有问题。[ -z "$n" ]
可以判断变量 n 是否为空
5、本例中的 mail.py 内容及用法,需要大家自行扩展学习