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

脚本用到了一个文件:ipsearch,此文件的内容格式如下:
221.222.223.224  ==>  a013
192.168.36.224   ==>  a013
每行一个,格式为 : IP地址 ==> 主机名
主机名.公司域名==该主机域名
例如:公司域名为chinaunix.net,那么c123.chinaunix.net这台机器的HOSTNAME就是c123
每台机器都有内外两个网卡,内网(eth0)是192.168.36段,外网(eth1)是221.222.223段.
对应的域名是:internal.domain.com和domain.com,内网多了层intern
建议阅读顺序:主循环->ping_ip函数,critical_ip函数,ok_ip函数。(从后往前看)

#!/bin/bash
##############################################################################
# 日期   : 2011-10-15
# 作者   : xiaoxi227
# Email : xiaoxi227@163.com
# 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="domain.com" # 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="internal.domain.com"
# 一个网卡挂了,测试另一个是否也挂了
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="$msg Ping 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

  1. declare -i count=0
  2. for ip in `grep "==>" /bin/ipsearch | grep -v null | awk '/==>/{ print $1 }'`
  3. do
  4. count=count+1
  5. export downfile=/tmp/${ip}.down.yangmingzhi.do.not.delete.tmp
  6. ping_ip $ip
  7. remainder=$(($count%100))
  8. if [ $remainder -eq 0 ];then
  9. wait
  10. fi
  11. done

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值