zoukankan      html  css  js  c++  java
  • Linux服务器内存监控—每小时检查&超出发送邮件&重启占用最高的Java程式

    简介与优点

    使用该脚本能自行判断系统内存使用情况是否超出设定百分比
    能在超出预警值时执行重启程式的操作
    能记录重启过程,并将具体LOG邮件发送给指定收信人
    可以设定Crontab排程,达成每隔一段时间运行一次

    准备工作

    开启邮箱的SMTP功能

    这一步博主不会截图做傻瓜教程,但每一步都不会漏,看不懂的小伙伴可以百度找个有图教程。以QQ邮箱为例,进入设置->常规->POP3/IMAP/SMTP··->IMAP/SMTP服务,点击开启,会生成一个授权码,把这个授权码保存下来备用

    修改mail.rc配置文件

    输入以下命令编辑mail.rc文件

    vim /etc/mail.rc
    

    在文件末尾追加以下配置内容

    set from=heicaijun@qq.com              #这里设定发信人的邮箱
    set smtp=smtp.qq.com                   #这里设定QQ的SMTP服务器,其他邮箱可以参考百度
    set smtp-auth-user=heicaijun@qq.com    #这里设定用户名
    set smtp-auth-password=sahflkhsaffshaf #这里设定你上一步保存的授权码
    set smtp-auth=login                    #这里设为login
    #下面是SSL加密相关的配置
    #set smtp-use-starttls 这里是不需要配置的,很多地方没说明,配置了反而会验证失败,所以我注释掉;
    set ssl-verify=ignore
    set nss-config-dir=/root/.certs
    

    测试邮件是否成功发送

    使用以下命令测试邮件是否成功发送,邮箱填你自己的,如果报错请直接百度报错部分解决。

    echo "测试邮件正文部分"|mail -s "测试邮件标题部分" heicaijun@qq.com
    

    MemMonitor.sh

    下载地址以下是脚本文件部分,请根据自己的实际情况修改。

    #!/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如下:
    [stop运行结果为:] ${stopResult};
    [start运行结果为:] ${startResult}"
    	echo -e "${DATA4}" >> ${log_dir}
    	echo "--->第${restartTime}次释放内存完成 ! " >> ${log_dir}
    }
    # 该函数是发送邮件的函数
    function sendMail(){
    	# 将需要发送的内容记录在mailTemp的缓存Log中
    	echo -e "${DATA1}
    ${DATA2}
    ${DATA4}" >> ${mail_temp}
    	# 将需要发送的内容输出到正文,并将之前缓存的Log以附件的形式发送给收信人,-a后接的是附件部分
    	echo -e "${DATA1}
    ${DATA2}
    ${DATA3}
    
    以上,请关注!" | 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  
            # 将邮件的标题设置为Alarm级别
    	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如下
    [stop运行结果为:] ${stopResult};
    [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}
    

    设置Crontab排程

    在设定Crontab排程的时候一定要注意,crontab默认不会加载环境变量,所以在运行java程式的时候,会出现找不到环境变量的问题。所以需要在启动脚本前调用./etc/profile;,另外,由于排程是默认在user目录下运行的,所以当你的脚本出现相对路径的时候可能会出错,所以建议加个cd /脚本目录/脚本.sh;
    以下为完整过程

    1. 输入以下命令设置排程
    crontab -e
    
    1. 在文件末尾追加以下排程
    # 以下6段(用空格隔开的)分别代表 分 时 日 月 年 需要运行的代码,*表示匹配所有时间段,30代表30分钟,*/1代表能被1整除的小时。所以以下排程的完整意思是每小时的30分都运行一下MEMMonitor.sh, 
    30 */1 * * * ./etc/profile;cd /home/p4fdc/PeakPerformance/;/home/p4fdc/PeakPerformance/MemMonitor.sh > /dev/null
    
  • 相关阅读:
    Contains Duplicate III
    Contains Duplicate
    bitmap
    机器人的运动范围
    矩阵中的路径
    不要62
    牛顿迭代法求方程的根
    统计C语言合法字符
    迭代法求平方根
    欧几里德算法(求两个正整数的最大公约数)
  • 原文地址:https://www.cnblogs.com/heicaijun/p/12785448.html
Copyright © 2011-2022 走看看