点击(此处)折叠或打开
- #! /bin/bash
- source /shell.to.run/servers.sh #读取服务器的IP地址(数组形式)、端口、用户名、密码等
- source /etc/profile
- shnum=`ps -ef | grep downlog | grep -v grep | wc -l`
- if [ $shnum -gt 5 ]#定义此脚本的运行实例数并做统计,若超过五个则退出脚本
- then
- exit
- else
- looplen=${#server[*]} #计算服务器IP地址数组的长度
- today=`date +%b%d`
- if test ! -d /cnrzip/LOG/$today
- then
- mkdir /cnrzip/LOG/$today #today这个时间戳作为文件夹目录,用于存放当日的日志文件。if test ! -d用于判断文件夹是否存在,不存在就创建
- fi
- j=0
- while [ $j -ne $looplen ] #开始数组循环
- do
- serverip=${server[$j]}#依次读取数组中的当前循环元素
- 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文件中
- #-r--r--r-- 1 ftp ftp 20001948 Apr 07 10:38 name_dhcp_1_log.01(lftp的ls显示,与系统中ls的区别在于月份之前会补全0,例中为 Apr 07)
- awk '{print $6,$7,$8}' /cnr/$serverip/list | sed 's/ //g' > /cnr/$serverip/list.time #把lftp显示的时间格式化,格式化后的结果应该是Apr0710:38这种格式
- ftptime=`cat /cnr/$serverip/list.time` #把格式化后的时间作为比对时间(ftp上文件生成时间)
- fulltime=`date +%c`
- shortime=`date +%R`
- if test ! -e /cnr/$serverip/$ftptime#检查最新的文件是否存在(一旦ftp上的文件生成时间有变,则list.time里面的时间戳应该会有变化)
- then
- lftp -u $username,$passwd -p $ftport $serverip -e " get name_dhcp_1_log.01 -o /cnr/$serverip/$ftptime && exit " #如果ftp上的文件在本地没有,则下载下来并另存为ftp上的时间戳
- echo $fulltime "i'm downloading" >> /cnr/$serverip/shell.log
- ############################################################
- Discover=`cat /cnr/$serverip/$ftptime | grep "DHCPDISCOVER" | wc -l`
- Offer=`cat /cnr/$serverip/$ftptime | grep "Lease offered to MAC" | wc -l`
- Request=`cat /cnr/$serverip/$ftptime | grep "Server received a DHCPREQUEST packet" | wc -l`
- Ack=`cat /cnr/$serverip/$ftptime | grep "granted" | wc -l`
- Release=`cat /cnr/$serverip/$ftptime | grep "Release" | wc -l`
- Buffer=`cat /cnr/$serverip/$ftptime | grep "Requests will be ignored" | wc -l`
- Ldapmiss=`cat /cnr/$serverip/$ftptime | grep "Unable to the find" | wc -l`
- Ldapoverload=`cat /cnr/$serverip/$ftptime | grep " may be overloaded" | wc -l`
- ###这段代码是统计各类DHCP信息的日志量,Ldapmiss和Ldapoverload是CNR与LDAP之间的通信log###
- ############################################################
- Result=`echo "scale=2;$Discover/$Offer" | bc`
- Times1=`echo "$Result>1.5" | bc`#上述两条是计算Discover和Offer之间的数量比,CNR在高并发的情况下会可能出现收到了Discover后不发送Offer的bug。这里设置当比例($Result)超过1.5的时候则$Times为真(=1)
- 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#日志关键字统计后的列表的格式化
- if [ $Times1 -eq 1 ]
- then
- echo -e "The number of Discover divided by the number of Offer is equal to $Result --from $serverip" > /shell.to.run/Times1.txt
- 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
- fi
- #如果Discover和Offer的比例超过1.5则发送邮件告警;mutt中-s是主题,-a是附件,-c是抄送,最后附带主送邮件地址(这里就是[email protected]这个邮件地址),< /shell.to.run/Times1.txt是邮件内容,使用重定向导入
- if [ $Buffer -ge 5 ]
- then
- cat /cnr/$serverip/$ftptime | grep "Requests will be ignored" > /shell.to.run/BufferLog.txt
- 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
- fi
- #如果出现Buffer满则发送邮件告警
- if [ $Ldapmiss -ge 5 ]
- then
- cat /cnr/$serverip/$ftptime | grep "Unable to the find" > /shell.to.run/LdapmissLog.txt
- 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
- fi
- #出现Ldap故障时发送邮件告警
- if [ $Ldapoverload -ge 5 ]
- then
- cat /cnr/$serverip/$ftptime | grep "may be overloaded" > /shell.to.run/LdapoverloadLog.txt
- 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
- fi
- #出现Ldap故障时发送邮件告警
- fi
- let j++
- done
- fi
- exit
备注:Shell中数组的写法应该是server(192.168.1.1 192.168.1.2 192.168.1.3)这样的格式
附上打包压缩脚本
点击(此处)折叠或打开
- #! /bin/bash
- source /shell.to.run/servers.sh
- source /etc/profile
- looplen=${#server[*]}
- ziptime=`date +%b%d --date="-1 day"`
- j=0
- while [ $j -ne $looplen ]
- do
- tar czf /cnrzip/${server[$j]}/$ziptime.tar.gz /cnr/${server[$j]}/$ziptime*
- nowtime=`date +%c`
- echo $nowtime "zip finished" >> /cnrzip/${server[$j]}/zip.log
- find /cnr/${server[$j]} -ctime +1 -exec rm -f {} \; #-exec和-xarg批量执行的内容过多时,发现会出现无法删除的问题。本来的find /cnr...这种的写法,但是发现一直有日志残留。于是一怒之下只能写到每个文件内查找。-ctime +1是指一天之前产生的文件。
- let j++
- done