#!/bin/bash # Powered By heicaijun # 2020/04/27 ###################################################### # 以下为配置部分 ############## # 设置的告警值为50%(即使用超过50%的时候告警)。 mem_warn=0.50 # log记录位置,每天记录在一个log上 DATETIME=$(date -d "today" +"%Y-%m-%d") log_dir="/home/p4fdc/PeakPerformance/FWlog/MemHistory_${DATETIME}.log" mail_temp=/home/p4fdc/PeakPerformance/MemMonitor.log mail_addr=heicaijun@qq.com ##################################################### # 该函数是启动java程式的函数 function startFW(){ startResult=`/home/p4fdc/PeakPerformance/start${fwid}.sh` #将release memory OK !记录到log日志中 DATA4="[$(date -d "today" +"%Y-%m-%d-%H-%M-%S")] 重启程式成功,详细LOG如下:\n[stop运行结果为:] ${stopResult};\n[start运行结果为:] ${startResult}" echo -e "${DATA4}" >> ${log_dir} echo "--->第${restartTime}次释放内存完成 ! " >> ${log_dir} } # 该函数是发送邮件的函数 function sendMail(){ # 将需要发送的内容记录在mailTemp的缓存Log中 echo -e "${DATA1}\n${DATA2}\n${DATA4}" >> ${mail_temp} # 将需要发送的内容输出到正文,并将之前缓存的Log以附件的形式发送给收信人 echo -e "${DATA1}\n${DATA2}\n${DATA3}\n\n以上,请关注!" | mail -s "${mailTitle}" -a ${mail_temp} ${mail_addr} # 发送完成后 rm -f ${mail_temp} } echo "============================" >> ${log_dir} echo "Start MemMonitor.sh..." >> ${log_dir} #系统分配的区总量 mem_total=`free -m | awk 'NR==2' | awk '{print $2}'` #当前剩余的大小 mem_free=`free -m | awk 'NR==2' | awk '{print $4}'` #当前已使用的used大小 mem_used=`free -m | awk 'NR==2' | awk '{print $3}'` #则计算当前剩余used所占总量的百分比,用小数来表示,要在小数点前面补一个整数位0 mem_per=0`echo "scale=2;$mem_used/$mem_total" | bc` DATA1="[$(date -d "today" +"%Y-%m-%d-%H-%M-%S")] 已使用内存百分比:${mem_per#*.}%,已使用:${mem_used}MB,总内存:${mem_total}MB" echo -e $DATA1 >> ${log_dir} #当前占用百分比与告警值进行比较(当大于告警值时会返回1,小于时会返回0 ) mem_now=`expr $mem_per \> $mem_warn` echo "是否大于告警值[1大于,0小于]:${mem_now}" >> ${log_dir} #如果当前使用超过50%(上面的返回值等于0),释放内存 if (($mem_now == 1)); then mailTitle="[ALARM]T4 AP1 Out Of Memory" echo -e "超过设定的报警值${mem_warn#*.}%..." >> ${log_dir} #获取目前占用内存最高的程式的DFID fwid=`ps -eo pid,args --sort=-pmem |head -n 2|awk 'NR==2' | awk '{print $4}'` fwid=${fwid#*_} fwmem=`ps -eo pmem --sort=-pmem |head -n 2|awk 'NR==2'` echo -e "${fwid}占用内存达${fwmem}%" >> ${log_dir} DATA2="[$(date -d "today" +"%Y-%m-%d-%H-%M-%S")] 超过设定的报警值${mem_warn#*.}%,其中${fwid}占用内存达${fwmem}%,执行重启${fwid}操作" #执行重启程式的操作 echo "开始执行重启${fwid}操作..." >> ${log_dir} stopResult=`/home/p4fdc/PeakPerformance/stop${fwid}.sh -f` if [[ $stopResult =~ "Successfully" ]]; then restartTime="一" startFW DATA3="[$(date -d "today" +"%Y-%m-%d-%H-%M-%S")] 重启程式成功,详细LOG请查看附件" sendMail else # 以下多判断了2次,其实一次基本够了,因为配合kill -9基本不会出现杀不掉程式的问题。 stopResult=`/home/p4fdc/PeakPerformance/stop${fwid}.sh -f` if [[ $stopResult =~ "Successfully" ]]; then restartTime="二" startFW DATA3="[$(date -d "today" +"%Y-%m-%d-%H-%M-%S")] 重启程式成功,详细LOG请查看附件" sendMail else stopResult=`/home/p4fdc/PeakPerformance/stop${fwid}.sh -f` if [[ $stopResult =~ "Successfully" ]]; then restartTime="三" startFW DATA3="[$(date -d "today" +"%Y-%m-%d-%H-%M-%S")] 重启程式成功,详细LOG请查看附件" sendMail else startResult=`/home/p4fdc/PeakPerformance/start${fwid}.sh` DATA4="[$(date -d "today" +"%Y-%m-%d-%H-%M-%S")] 重启程式失败,详细LOG如下\n[stop运行结果为:] ${stopResult};\n[start运行结果为:] ${startResult}" echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!! " >> ${log_dir} echo -e "${DATA4}" >> ${log_dir} echo "--->三次尝试释放内存失败,请手动检查 ! " >> ${log_dir} echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!! " >> ${log_dir} mailTitle="[!ERROR!]T4 AP1 Out Of Memory" DATA3="[$(date -d "today" +"%Y-%m-%d-%H-%M-%S")] 三次尝试释放内存失败,重启程式失败,详细LOG请查看附件" sendMail fi fi fi fi echo "============================" >> ${log_dir}