700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > SHELL脚本:检测一坨IP是否都能ping通(网卡监控)

SHELL脚本:检测一坨IP是否都能ping通(网卡监控)

时间:2018-08-24 02:41:39

相关推荐

SHELL脚本:检测一坨IP是否都能ping通(网卡监控)

工作快3年了,期间遇见过不少problems,每次都是上网搜之、解决了就算完了。也不曾写过什么文章。最近看见好多帖子提出的问题都是我曾遇见过的,但下面的回复却几乎都没有帮楼主解决问题。于是乎、我觉得我应该把我曾经的解决方案共享出来了,总是潜水确实不太应该。今天就贴一篇我写的代码吧,功能是监控公司所有服务器的IP是否能ping通,如果不通则报警并进行自动恢复。

前提:该脚本适用于IP地址不多的情形,因为本脚本中,有多少IP就会开多少个子进程,所以IP过多容易把机器跑挂,由于我公司IP不多,所以我就直接开了$number个子进程(number==IP的个数) 脚本用到了一个文件:ipsearch,此文件的内容格式如下: 221.222.223.224 ==> a013 192.168.36.224 ==> a013 每行一个,格式为 : IP地址 ==> 主机名 主机名.公司域名==该主机域名 例如:公司域名为,那么这台机器的HOSTNAME就是c123 每台机器都有内外两个网卡,内网(eth0)是192.168.36段,外网(eth1)是221.222.223段. 对应的域名是:和,内网多了层internal 脚本如下(较线上使用的脚本稍有改动):

点击(此处)折叠或打开

建议阅读顺序:主循环->ping_ip函数,critical_ip函数,ok_ip函数。(从后往前看)#!/bin/bash############################################################################### 日期 : -10-15# 作者 : xiaoxi227# Email : xiaoxi227@# QQ : 451914397# 脚本功能 : PING所有正在使用中的IP,判断所ping的IP是否挂掉,如果挂了,则进行自动恢复。# 调用关系 : 计划任务,每2分钟执行1次。# 其他说明 : 本脚本需要/bin/ipsearch作为数据来源,所ping的IP全取自于该脚本。############################################################################### 重启某台机器时,将其主机名填入下行引号内,可暂时取消对该主机的检测。# Note:引号内不要有空格ignored_host=""# 例如: ignored_host="d016"# 去除忽略主机列表中的空白字符ignored_host=$(echo $ignored_host | sed -r 's/[[:space:]]+//g')source /etc/rc.d/init.d/corporation_functions # 公司的函数库,下面用到时我会进行说明function ok_ip() # 当IP可以ping通时调用此函数{[ $# -ne 3 ] && {echo "Usage: $FUNCNAME <ip> <hostname> <nic name>" >&2 return } local ip=$1 local hostname=$2 local nic=$3 # 如果$downfile存在说明改IP已挂,现在是从故障状态恢复。 [ -f $downfile ] && {# 读取该IP挂掉时的时间 downtime=$(date +%s --date="$(head -1 $downfile)") current_time=$(date +%s) time_interval=$(($current_time-$downtime)) msg="Recovery:${hostname}:${nic}($ip) is up.Total down time:$time_interval seconds" send_msg "$msg" send_msn_msg "$msg" rm -f $downfile } # downfile不存在说明该IP正常,什么也不用做。}function critical_ip(){[ $# -ne 3 ] && {echo "Usage: $FUNCNAME <ip> <hostname> <nic name>" >&2 return } local ip=$1 local hostname=$2 local nic=$3 local nic_to_ssh="" # ssh已实现无密码登录 # downfile文件的格式:第一行:IP挂掉的时间。第二行:还可以发送报警的次数 # 如果该IP挂了,则发送报警信息,但是最多只发送10次,避免信息风暴。 # 实现方式是:每次发送一条报警信息读将计数器减一,计数器为0后就不再发送 if [ -f $downfile ];then downtime=$(date +%s --date="$(head -1 $downfile)") send_msg_times=$((sed -ne '2p' $downfile)) sed -i "2c$(($send_msg_times-1))" $downfile else downtime="$datetime" send_msg_times=10 echo -e "${downtime}\n$send_msg_times" >> $downfile fi if [ $send_msg_times -gt 0 ];then msg="警告:${hostname}:${nic}($ip) is down at 【${downtime}】。" msg="$msg丢包率100%,正在尝试自动恢复。" [ x"$nic" = x"eth1" ] && nic_to_ssh="" # 一个网卡挂了,测试另一个是否也挂了 lost_rate=`ping -c 8 -w 8 ${hostname}.${nic_to_ssh} \ | grep 'packet loss' \ | awk -F'packet loss' '{ print $1 }' \ | awk '{ print $NF }' \ | sed 's/%//g'` # ping 8次 # 如果另一个网卡丢包不是100%说明没挂,那么ssh过去重启挂掉的网卡 if [ $lost_rate -ne 100 ];then ssh ${hostname}.${nic_to_ssh} -- ifdown $nic ssh ${hostname}.${nic_to_ssh} -- ifup $nic else msg="警告、紧急警告:亲、${hostname}内外网卡全挂,请马上查看" send_msg "$msg" send_msn_msg "$msg" fi fi}function ping_ip(){# 函数功能:判断ping指定的IP是否丢包。 #若不丢包、调用OK函数处理; #若丢包100%,说明IP已挂掉,此时调用critical函数处理。 #否则直接发送一个通知,告知Op刚才ping丢包,但是网卡没挂,需要注意。 if [ $# -ne 1 ];then echo "Usage: $FUNCNAME <ip_address>" >&2 return else local ip=$1 fi # 判断当前检测的IP是内网(eth0)IP还是外网(eth1)IP? echo $ip | grep -q '192.168.36.' if [ $? -eq 0 ];then nic='eth0' else nic='eth1' fi hostname=$(grep $ip /bin/ipsearch | awk '{ print $3 }') # 获取该IP对应的主机名 # 如果在忽略列表里什么也不干直接返回。 if [ x"$hostname" = x"$ignored_host" ];then continue;fi # ping 8次 lost_rate=`ping -c 8 -w 8 $ip | grep 'packet loss' \ | awk -F'packet loss' '{ print $1 }' \ | awk '{ print $NF }' | sed 's/%//g'` if [ $lost_rate -eq 0 ];then ok_ip $ip $hostname $nic elif [ $lost_rate -lt 100 ];then msg="提醒:${hostname}:${nic}($ip)网络状况不佳." msg="$msgPing at 【$datetime】丢包率${$lost_rate}%," msg="$msg此状态下程序不会重启网卡,请留意网络状况。" send_msg "$msg" send_msn_msg "$msg" # $datetime是当前时间,send_msg和send_msn_msg是发送短信和msn消息的函数 else critical_ip $ip $hostname $nic fi}############################################################################## 前面都是函数,主进程从下面开始# 从/bin/ipsearch这个文件里拿出所有要监控的IP地址for ip in `grep "==>" /bin/ipsearch | grep -v null | awk '/==>/{ print $1 }'`do # 有多少个IP就在后台开多少子进程,并行检测,如果IP过多,请勿这样操作,以免把机器跑挂。 ( # 如果该IP挂了,会把跟这个IP有关的一些信息记录到$downfile这个文件里 export downfile=/tmp/${ip}.down.yangmingzhi.do.not.delete.tmp # 调用ping ip的函数,检测当前IP是否能ping通。 ping_ip $ip )&done 以上脚本适用于IP不多的情形,如果IP很多,可按如下方式编写:

点击(此处)折叠或打开

declare -i count=0for ip in `grep "==>" /bin/ipsearch | grep -v null | awk '/==>/{ print $1 }'`do count=count+1 export downfile=/tmp/${ip}.down.yangmingzhi.do.not.delete.tmp ping_ip $ip remainder=$(($count%100)) if [ $remainder -eq 0 ];then wait fidone 这样每当程序开启100个子进程后都会挂起,直至这100个子进程都执行完毕,之后才会开启下100个子进程。当然也可以每开起一个新子进程之前都检测一下当前进程的个数,如果没到100个就继续开新进程,否则sleep一段时间或者wait一下都可以。解决方案有很多,总有一个会适合你的情形。以上所列就是适用于本人所在公司的监控脚本。希望对有同样需求的同学们有所帮助

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。