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

前提:该脚本适用于IP地址不多的情形,因为本脚本中,有多少IP就会开多少个子进程,所以IP过多容易把机器跑挂,由于我公司IP不多,所以我就直接开了$number个子进程(number==IP的个数)
脚本用到了一个文件: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,内网多了层internal
脚本如下(较线上使用的脚本稍有改动):

点击(此处)折叠或打开

  1. 建议阅读顺序:主循环->ping_ip函数,critical_ip函数,ok_ip函数。(从后往前看)
  2. #!/bin/bash
  3. ##############################################################################
  4. # 日期   : 2011-10-15
  5. # 作者   : xiaoxi227
  6. # Email : xiaoxi227@163.com
  7. # QQ    : 451914397
  8. # 脚本功能 : PING所有正在使用中的IP,判断所ping的IP是否挂掉,如果挂了,则进行自动恢复。
  9. # 调用关系 : 计划任务,每2分钟执行1次。
  10. # 其他说明 : 本脚本需要/bin/ipsearch作为数据来源,所ping的IP全取自于该脚本。
  11. ##############################################################################
  12. # 重启某台机器时,将其主机名填入下行引号内,可暂时取消对该主机的检测。
  13. # Note:引号内不要有空格
  14. ignored_host=""
  15. # 例如: ignored_host="d016"
  16. # 去除忽略主机列表中的空白字符
  17. ignored_host=$(echo $ignored_host | sed -r 's/[[:space:]]+//g')
  18. source /etc/rc.d/init.d/corporation_functions  # 公司的函数库,下面用到时我会进行说明
  19. function ok_ip()  # 当IP可以ping通时调用此函数
  20. {
  21. [ $# -ne 3 ] && {
  22. echo "Usage: $FUNCNAME <ip> <hostname> <nic name>" >&2
  23. return
  24. }
  25. local ip=$1
  26. local hostname=$2
  27. local nic=$3
  28. # 如果$downfile存在说明改IP已挂,现在是从故障状态恢复。
  29. [ -f $downfile ] && {
  30. # 读取该IP挂掉时的时间
  31. downtime=$(date +%s --date="$(head -1 $downfile)")
  32. current_time=$(date +%s)
  33. time_interval=$(($current_time-$downtime))
  34. msg="Recovery:${hostname}:${nic}($ip) is up.Total down time:$time_interval seconds"
  35. send_msg "$msg"
  36. send_msn_msg "$msg"
  37. rm -f $downfile
  38. }
  39. # downfile不存在说明该IP正常,什么也不用做。
  40. }
  41. function critical_ip()
  42. {
  43. [ $# -ne 3 ] && {
  44. echo "Usage: $FUNCNAME <ip> <hostname> <nic name>" >&2
  45. return
  46. }
  47. local ip=$1
  48. local hostname=$2
  49. local nic=$3
  50. local nic_to_ssh="domain.com" # ssh已实现无密码登录
  51. # downfile文件的格式:第一行:IP挂掉的时间。第二行:还可以发送报警的次数
  52. # 如果该IP挂了,则发送报警信息,但是最多只发送10次,避免信息风暴。
  53. # 实现方式是:每次发送一条报警信息读将计数器减一,计数器为0后就不再发送
  54. if [ -f $downfile ];then
  55. downtime=$(date +%s --date="$(head -1 $downfile)")
  56. send_msg_times=$((sed -ne '2p' $downfile))
  57. sed -i "2c$(($send_msg_times-1))" $downfile
  58. else
  59. downtime="$datetime"
  60. send_msg_times=10
  61. echo -e "${downtime}\n$send_msg_times" >> $downfile
  62. fi
  63. if [ $send_msg_times -gt 0 ];then
  64. msg="警告:${hostname}:${nic}($ip) is down at 【${downtime}】。"
  65. msg="$msg 丢包率100%,正在尝试自动恢复。"
  66. [ x"$nic" = x"eth1" ] && nic_to_ssh="internal.domain.com"
  67. # 一个网卡挂了,测试另一个是否也挂了
  68. lost_rate=`ping -c 8 -w 8 ${hostname}.${nic_to_ssh} \
  69. | grep 'packet loss' \
  70. | awk -F'packet loss' '{ print $1 }' \
  71. | awk '{ print $NF }' \
  72. | sed 's/%//g'` # ping 8次
  73. # 如果另一个网卡丢包不是100%说明没挂,那么ssh过去重启挂掉的网卡
  74. if [ $lost_rate -ne 100 ];then
  75. ssh ${hostname}.${nic_to_ssh} -- ifdown $nic
  76. ssh ${hostname}.${nic_to_ssh} -- ifup $nic
  77. else
  78. msg="警告、紧急警告:亲、${hostname}内外网卡全挂,请马上查看"
  79. send_msg "$msg"
  80. send_msn_msg "$msg"
  81. fi
  82. fi
  83. }
  84. function ping_ip()
  85. {
  86. # 函数功能:判断ping指定的IP是否丢包。
  87. #          若不丢包、调用OK函数处理;
  88. #          若丢包100%,说明IP已挂掉,此时调用critical函数处理。
  89. #          否则直接发送一个通知,告知Op刚才ping丢包,但是网卡没挂,需要注意。
  90. if [ $# -ne 1 ];then
  91. echo "Usage: $FUNCNAME <ip_address>" >&2
  92. return
  93. else
  94. local ip=$1
  95. fi
  96. # 判断当前检测的IP是内网(eth0)IP还是外网(eth1)IP?
  97. echo $ip | grep -q '192.168.36.'
  98. if [ $? -eq 0 ];then
  99. nic='eth0'
  100. else
  101. nic='eth1'
  102. fi
  103. hostname=$(grep $ip /bin/ipsearch | awk '{ print $3 }') # 获取该IP对应的主机名
  104. # 如果在忽略列表里什么也不干直接返回。
  105. if [ x"$hostname" = x"$ignored_host" ];then continue;fi
  106. # ping 8次
  107. lost_rate=`ping -c 8 -w 8 $ip | grep 'packet loss' \
  108. | awk -F'packet loss' '{ print $1 }' \
  109. | awk '{ print $NF }' | sed 's/%//g'`
  110. if [ $lost_rate -eq 0 ];then
  111. ok_ip $ip $hostname $nic
  112. elif [ $lost_rate -lt 100 ];then
  113. msg="提醒:${hostname}:${nic}($ip)网络状况不佳."
  114. msg="$msg Ping at 【$datetime】丢包率${$lost_rate}%,"
  115. msg="$msg 此状态下程序不会重启网卡,请留意网络状况。"
  116. send_msg "$msg"
  117. send_msn_msg "$msg"
  118. # $datetime是当前时间,send_msg和send_msn_msg是发送短信和msn消息的函数
  119. else
  120. critical_ip $ip $hostname $nic
  121. fi
  122. }
  123. #############################################################################
  124. # 前面都是函数,主进程从下面开始
  125. # 从/bin/ipsearch这个文件里拿出所有要监控的IP地址
  126. for ip in `grep "==>" /bin/ipsearch | grep -v null | awk '/==>/{ print $1 }'`
  127. do
  128. # 有多少个IP就在后台开多少子进程,并行检测,如果IP过多,请勿这样操作,以免把机器跑挂。
  129. (
  130. # 如果该IP挂了,会把跟这个IP有关的一些信息记录到$downfile这个文件里
  131. export downfile=/tmp/${ip}.down.yangmingzhi.do.not.delete.tmp
  132. # 调用ping ip的函数,检测当前IP是否能ping通。
  133. ping_ip $ip
  134. )&
  135. done

以上脚本适用于IP不多的情形,如果IP很多,可按如下方式编写:

点击(此处)折叠或打开

  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

这样每当程序开启100个子进程后都会挂起,直至这100个子进程都执行完毕,之后才会开启下100个子进程。当然也可以每开起一个新子进程之前都检测一下当前进程的个数,如果没到100个就继续开新进程,否则sleep一段时间或者wait一下都可以。解决方案有很多,总有一个会适合你的情形。以上所列就是适用于本人所在公司的监控脚本。希望对有同样需求的同学们有所帮助

转载于:https://blog.51cto.com/daniang/950122

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

  1. 【Linux】20.shell脚本 检测是否 ping 通

    shell脚本 检测是否 ping 通 -c: 表示次数,1 为1次 -w: 表示deadline, time out的时间,单位为秒,100为100秒. # ping一次该ip, 超时设置1s(如果 ...

  2. Nginx学习笔记3:Shell脚本检测Nginx服务状态

    前言 nginx 服务启动后,我们需要对其服务状态进行监控,今天学习过程中了解到一段非常有用的小脚本,不仅可以监控Nginx,也可以用来监控其他服务 脚本 A=`ps -C nginx –no-hea ...

  3. shell脚本通过正则表达式提取 IP 地址

    假设需要提取的 IP 地址在文件 test.txt 中,可以使用以下 shell 脚本通过正则表达式提取 IP 地址并打印 grep -E -o "([0-9]{1,3}.){3}[0-9] ...

  4. linux可平通网关但不能上网,redhat问题:能ping通网关和本网段的IP,但是不能ping通DNS,也不能上网...

    redhat问题:能ping通网关和本网段的IP,但是不能ping通DNS,也不能上网 (2011-12-20 06:11:51) 标签: 上网 杂谈 redhat问题:能ping通网关和本网段的IP ...

  5. VGA GPU passthrough qemu虚拟桌面pci穿透--Shell脚本检测与关机

    转载注明:http://blog.csdn.net/hubbybob1/article/details/77199162 本文主要讲解在VGA GPU passthrough成功后,如果关闭虚拟机wi ...

  6. 利用shell脚本批量判断目标ip存活情况

    一.目的 有时候需要批量去判断目标ip是否存活,一个一个去试多麻烦所以写了个shell脚本去批量尝试,原理使用的是去ping目标ip,虽然这种方法受很多因素影响,比如网速,防火墙禁ping等,但是也是 ...

  7. Shell脚本检测容器是否运行

    使用 Shell 脚本来检测容器是否运行 #!/bin/sh NAME="Nginx" # 容器名称 if [[ -n $(docker ps -q -f "name=$ ...

  8. 教你用shell脚本检测服务器程序是否在运行

    shell脚本定时检测python程序是否运行 shell脚本 #!/bin/bashecho "开始检查运费fright_run程序是否运行..."cd /opt/gh2/app ...

  9. linux shell 脚本 if和else代码块都被执行 | shell 批量添加、删除用户(for循环做if嵌套)

    前言: 略懂编程的都知道,if else只能进其一,满足if条件就不会进else, 然而在shell学习过程中,却遇到了,满足了if条件后,依然执行了else中的代码块. 本案例所有代码均在:/roo ...

最新文章

  1. 解决VirtualBox 上的XP 关机时重启 , 启动时蓝屏 ,点击电源选项蓝屏
  2. CLR Via C# 3rd 阅读摘要 -- Chapter 28 – Primitive Thread Synchronization Constructs
  3. 大剑无锋之SpringBoot和Spring的区别
  4. 阿里内推题——物流派送员送快递最短路径问题
  5. (八)linux驱动之ioctl的使用
  6. macos big sur u盘安装_老款macbook机型欺骗补丁强制安装macOS11 Big Sur图文详解
  7. Java当中的异常处理
  8. mac idea命令精简使用版常用指令
  9. 使用 Sonar 进行代码质量管理
  10. 荣耀30s刷鸿蒙,荣耀终于放出大招!4部荣耀旗舰可升级鸿蒙,网友:终于等到了...
  11. 空气污染扩散模型-高斯烟羽烟团模型原理及GIS应用示例
  12. 稚晖君教你制作全球最迷你的自平衡机器人
  13. cacti mysql 压缩 备份_cacti数据迁移步骤 CactiEZ重装系统后 恢复原来的数据 CactiEZ重装系统前要备份的数据...
  14. 大淘客php源码美化版,【完整包】大淘客cms升级源码v12221 大淘客二次开发源码 - 下载 - 搜珍网...
  15. 5.绘制统计图形——堆积图
  16. 我很高兴,很欣慰:)
  17. 优秀孩子的父母都有这五个特点
  18. STM8L051之通过ADC1与DMA读取内部参考电压,求取VDD电源电压---库函数版
  19. linux查看lv逻辑卷信息,Linux学习笔记(lvm pv物理卷—VG卷组—LV逻辑卷)
  20. pip安装三方库不成功的解决方法

热门文章

  1. Tornado基础知识
  2. qt开发用的人多吗_开发商设计的 Bot 程序会毁了多人游戏吗?
  3. 大众点评(最新字体反爬)
  4. 一份关于IT学子的2020年度报告
  5. 炫酷HTML5网页背景动画
  6. 计算机知识不如别人,一个计算机从业人员的心声——有时候“授人以渔不如授之以鱼”...
  7. Matlab模型开发之——从建模规范开启旅程2 Stateflow
  8. 更改打印机首选项设置
  9. Base64和Base64URL
  10. Handlebars