本人负责公司的DHCP服务器,服务器承载网络中约近50多万台终端设备的地址分配情况。软件使用的是Cisco Network Registar,由于Cisco平台二次开发比较繁琐,同时公司的网管系统开发进度缓慢。于是本人尝试着写了一段监控的小脚本,用于对关键指标的监控。如有错误或可改进的地方,下手请轻一些。

点击(此处)折叠或打开

  1. #! /bin/bash
  2. source /shell.to.run/servers.sh #读取服务器的IP地址(数组形式)、端口、用户名、密码等
  3. source /etc/profile
  4. shnum=`ps -ef | grep downlog | grep -v grep | wc -l`
  5. if [ $shnum -gt 5 ]#定义此脚本的运行实例数并做统计,若超过五个则退出脚本
  6.     then
  7.         exit
  8.     else
  9.         looplen=${#server[*]} #计算服务器IP地址数组的长度
  10.         today=`date +%b%d`
  11.     if test ! -d /cnrzip/LOG/$today
  12.         then
  13.             mkdir /cnrzip/LOG/$today #today这个时间戳作为文件夹目录,用于存放当日的日志文件。if test ! -d用于判断文件夹是否存在,不存在就创建
  14.     fi
  15.     j=0
  16.     while [ $j -ne $looplen ] #开始数组循环
  17.     do
  18.         serverip=${server[$j]}#依次读取数组中的当前循环元素
  19.         lftp -u $username,$passwd -p $ftport $serverip -e " ls | grep name_dhcp_1_log.01 > /cnr/$serverip/list && exit " #使用lftp登陆到服务器(使用方法如变量名),并执行lftp内部命令(-e)列出name_dhcp_1_log.01的明细(lftp的ls与系统中的略有不同)并导出到该服务器IP地址文件夹下的list文件中
  20.         #-r--r--r-- 1 ftp ftp 20001948 Apr 07 10:38 name_dhcp_1_log.01(lftp的ls显示,与系统中ls的区别在于月份之前会补全0,例中为 Apr 07)
  21.         awk '{print $6,$7,$8}' /cnr/$serverip/list | sed 's/ //g' > /cnr/$serverip/list.time #把lftp显示的时间格式化,格式化后的结果应该是Apr0710:38这种格式
  22.         ftptime=`cat /cnr/$serverip/list.time` #把格式化后的时间作为比对时间(ftp上文件生成时间)
  23.         fulltime=`date +%c` 
  24.         shortime=`date +%R` 
  25.         if test ! -e /cnr/$serverip/$ftptime#检查最新的文件是否存在(一旦ftp上的文件生成时间有变,则list.time里面的时间戳应该会有变化)
  26.     then
  27.         lftp -u $username,$passwd -p $ftport $serverip -e " get name_dhcp_1_log.01 -o /cnr/$serverip/$ftptime && exit " #如果ftp上的文件在本地没有,则下载下来并另存为ftp上的时间戳
  28.         echo $fulltime "i'm downloading" >> /cnr/$serverip/shell.log
  29.         ############################################################
  30.         Discover=`cat /cnr/$serverip/$ftptime | grep "DHCPDISCOVER" | wc -l`
  31.         Offer=`cat /cnr/$serverip/$ftptime | grep "Lease offered to MAC" | wc -l`
  32.         Request=`cat /cnr/$serverip/$ftptime | grep "Server received a DHCPREQUEST packet" | wc -l`
  33.         Ack=`cat /cnr/$serverip/$ftptime | grep "granted" | wc -l`
  34.         Release=`cat /cnr/$serverip/$ftptime | grep "Release" | wc -l`
  35.         Buffer=`cat /cnr/$serverip/$ftptime | grep "Requests will be ignored" | wc -l`
  36.         Ldapmiss=`cat /cnr/$serverip/$ftptime | grep "Unable to the find" | wc -l`
  37.         Ldapoverload=`cat /cnr/$serverip/$ftptime | grep " may be overloaded" | wc -l`
  38.         ###这段代码是统计各类DHCP信息的日志量,Ldapmiss和Ldapoverload是CNR与LDAP之间的通信log###
  39.         ############################################################
  40.         Result=`echo "scale=2;$Discover/$Offer" | bc`
  41.         Times1=`echo "$Result>1.5" | bc`#上述两条是计算Discover和Offer之间的数量比,CNR在高并发的情况下会可能出现收到了Discover后不发送Offer的bug。这里设置当比例($Result)超过1.5的时候则$Times为真(=1)
  42.         echo -e "Discover:$Discover\tOffer:$Offer\tRequest:$Request\tAck:$Ack\tRelease:$Release\tBuffer:$Buffer\tLdapmiss:$Ldapmiss\tLdapoverload:$Ldapoverload\tTime:$shortime" >> /cnrzip/LOG/$today/$serverip.log#日志关键字统计后的列表的格式化
  43.         if [ $Times1 -eq 1 ]
  44.             then
  45.                 echo -e "The number of Discover divided by the number of Offer is equal to $Result --from $serverip" > /shell.to.run/Times1.txt
  46.                 mutt -s "LOG warning from $serverip" -a /cnrzip/LOG/$today/$serverip.log -a /shell.to.run/emergency.zip -c [email protected] -c nocip@126.com jwgu@126.com < /shell.to.run/Times1.txt
  47.         fi
  48.         #如果Discover和Offer的比例超过1.5则发送邮件告警;mutt中-s是主题,-a是附件,-c是抄送,最后附带主送邮件地址(这里就是[email protected]这个邮件地址),< /shell.to.run/Times1.txt是邮件内容,使用重定向导入
  49.         if [ $Buffer -ge 5 ]
  50.             then
  51.                 cat /cnr/$serverip/$ftptime | grep "Requests will be ignored" > /shell.to.run/BufferLog.txt
  52.                 mutt -s "Buffer warning form $serverip" -a /shell.to.run/emergency.zip -a /shell.to.run/BufferLog.txt -c jzgao@126.com -c nocip@126.com jwgu@126.com < /shell.to.run/Buffer.txt
  53.         fi
  54.         #如果出现Buffer满则发送邮件告警
  55.         if [ $Ldapmiss -ge 5 ]
  56.             then
  57.                cat /cnr/$serverip/$ftptime | grep "Unable to the find" > /shell.to.run/LdapmissLog.txt
  58.                mutt -s "Ldap-miss warning from $serverip" -a /shell.to.run/emergency.zip -a /shell.to.run/LdapmissLog.txt -c jzgao@126.com -c nocip@126.com jwgu@126.com < /shell.to.run/Ldapmiss.txt
  59.         fi
  60.         #出现Ldap故障时发送邮件告警
  61.         if [ $Ldapoverload -ge 5 ]
  62.             then
  63.                 cat /cnr/$serverip/$ftptime | grep "may be overloaded" > /shell.to.run/LdapoverloadLog.txt
  64.                 mutt -s "Ldap-overload warning from $serverip" -a /shell.to.run/emergency.zip -a /shell.to.run/LdapoverloadLog.txt -c jzgao@126.com -c nocip@126.com jwgu@126.com < /shell.to.run/Ldapoverload.txt
  65.         fi
  66.         #出现Ldap故障时发送邮件告警
  67.     fi
  68.     let j++
  69.     done
  70. fi
  71. exit

备注:Shell中数组的写法应该是server(192.168.1.1 192.168.1.2 192.168.1.3)这样的格式

附上打包压缩脚本

点击(此处)折叠或打开

  1. #! /bin/bash
  2. source /shell.to.run/servers.sh
  3. source /etc/profile
  4. looplen=${#server[*]}
  5. ziptime=`date +%b%d --date="-1 day"`
  6. j=0

  7. while [ $j -ne $looplen ]
  8.     do
  9.         tar czf /cnrzip/${server[$j]}/$ziptime.tar.gz /cnr/${server[$j]}/$ziptime*
  10.         nowtime=`date +%c`
  11.         echo $nowtime "zip finished" >> /cnrzip/${server[$j]}/zip.log
  12.         find /cnr/${server[$j]} -ctime +1 -exec rm -f {} \; #-exec和-xarg批量执行的内容过多时,发现会出现无法删除的问题。本来的find /cnr...这种的写法,但是发现一直有日志残留。于是一怒之下只能写到每个文件内查找。-ctime +1是指一天之前产生的文件。
  13.         let j++
  14.     done


09-13 20:43