SHELL脚本:检测一坨IP是否都能ping通(网卡监控)
工作快3年了,期间遇见过不少problems,每次都是上网搜之、解决了就算完了。也不曾写过什么文章。最近看见好多帖子提出的问题都是我曾遇见过的,但下面的回复却几乎都没有帮楼主解决问题。于是乎、我觉得我应该把我曾经的解决方案共享出来了,总是潜水确实不太应该。今天就贴一篇我写的代码吧,功能是监控公司所有服务器的IP是否能ping通,如果不通则报警并进行自动恢复。
点击(此处)折叠或打开
- 建议阅读顺序:主循环->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
点击(此处)折叠或打开
- declare -i count=0
- for 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
- fi
- done
这样每当程序开启100个子进程后都会挂起,直至这100个子进程都执行完毕,之后才会开启下100个子进程。当然也可以每开起一个新子进程之前都检测一下当前进程的个数,如果没到100个就继续开新进程,否则sleep一段时间或者wait一下都可以。解决方案有很多,总有一个会适合你的情形。以上所列就是适用于本人所在公司的监控脚本。希望对有同样需求的同学们有所帮助
转载于:https://blog.51cto.com/daniang/950122
SHELL脚本:检测一坨IP是否都能ping通(网卡监控)相关推荐
- 【Linux】20.shell脚本 检测是否 ping 通
shell脚本 检测是否 ping 通 -c: 表示次数,1 为1次 -w: 表示deadline, time out的时间,单位为秒,100为100秒. # ping一次该ip, 超时设置1s(如果 ...
- Nginx学习笔记3:Shell脚本检测Nginx服务状态
前言 nginx 服务启动后,我们需要对其服务状态进行监控,今天学习过程中了解到一段非常有用的小脚本,不仅可以监控Nginx,也可以用来监控其他服务 脚本 A=`ps -C nginx –no-hea ...
- shell脚本通过正则表达式提取 IP 地址
假设需要提取的 IP 地址在文件 test.txt 中,可以使用以下 shell 脚本通过正则表达式提取 IP 地址并打印 grep -E -o "([0-9]{1,3}.){3}[0-9] ...
- linux可平通网关但不能上网,redhat问题:能ping通网关和本网段的IP,但是不能ping通DNS,也不能上网...
redhat问题:能ping通网关和本网段的IP,但是不能ping通DNS,也不能上网 (2011-12-20 06:11:51) 标签: 上网 杂谈 redhat问题:能ping通网关和本网段的IP ...
- VGA GPU passthrough qemu虚拟桌面pci穿透--Shell脚本检测与关机
转载注明:http://blog.csdn.net/hubbybob1/article/details/77199162 本文主要讲解在VGA GPU passthrough成功后,如果关闭虚拟机wi ...
- 利用shell脚本批量判断目标ip存活情况
一.目的 有时候需要批量去判断目标ip是否存活,一个一个去试多麻烦所以写了个shell脚本去批量尝试,原理使用的是去ping目标ip,虽然这种方法受很多因素影响,比如网速,防火墙禁ping等,但是也是 ...
- Shell脚本检测容器是否运行
使用 Shell 脚本来检测容器是否运行 #!/bin/sh NAME="Nginx" # 容器名称 if [[ -n $(docker ps -q -f "name=$ ...
- 教你用shell脚本检测服务器程序是否在运行
shell脚本定时检测python程序是否运行 shell脚本 #!/bin/bashecho "开始检查运费fright_run程序是否运行..."cd /opt/gh2/app ...
- linux shell 脚本 if和else代码块都被执行 | shell 批量添加、删除用户(for循环做if嵌套)
前言: 略懂编程的都知道,if else只能进其一,满足if条件就不会进else, 然而在shell学习过程中,却遇到了,满足了if条件后,依然执行了else中的代码块. 本案例所有代码均在:/roo ...
最新文章
- 在linux和windows下自动备份数据库
- HTML全面深入学习-select的optgroup分组
- ECMAScript6 规范
- Python入门、进阶经典PDF下载
- bytebuf池_图文分析ByteBuf是什么
- python数据的格式输出_Python格式化输出
- JavaScript从初级往高级走系列————Virtual Dom
- STM32 串口详解
- 神龙神龙你擦亮眼,阿里巴巴要“上天”!
- java对象的内存结构_Java对象在内存中的结构分析
- mysql replicatedodb_MySQL存储引擎MyISAM与InnoDB的区别
- 计算机自我鉴定高中生200字,精编高中生自我鉴定200字左右3篇 高中自我鉴定200字...
- android 驱动程序,安卓设备安装USB驱动程序教程
- 21.pgsql中的执行计划explain
- 原生 APP 与 web APP的区别比较
- 3D打印美容设备MagicBox
- 【EM算法】期望最大化算法
- 12.15有一种数叫回文数,正读和反读都一样,如12321便是一个回文数。编写一个程序,从命令行得到一个整数,判断该数是不是回文数
- 雨天在火车站台上撑伞会触电吗?
- graphpad如何检测方差齐_如何用 GraphPad prism进行 t 检验?
热门文章
- 【2022 CCF BDCI文心大模型创意项目】使用文心大模型制作《十五的月亮》MV
- 查看cpu类型 linux,linux如何查看cpu类型
- 10款设计师常用的APP页面设计软件
- 第一讲 《javascript 浏览器发展历史》
- win2003 php5.6_护卫神·PHP套件(FastCGI-PHP5.6.9)
- 仿苹果Assistive Touch
- 空链接,a标签herf属性,href=“#” 或者 href=“javascript:void(0);” 或者href=“javascript:;“ 区别
- 让技术造福残障人士,让开发助力无障碍
- 数据库“写时模式”与“读时模式”对比
- css div隐藏滚动条,保留鼠标滚动效果。