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如下:\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以附件的形式发送给收信人,-a后接的是附件部分
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
# 将邮件的标题设置为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如下\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}
设置Crontab排程
在设定Crontab排程的时候一定要注意,crontab默认不会加载环境变量,所以在运行java程式的时候,会出现找不到环境变量的问题。所以需要在启动脚本前调用./etc/profile;,另外,由于排程是默认在user目录下运行的,所以当你的脚本出现相对路径的时候可能会出错,所以建议加个cd /脚本目录/脚本.sh;
以下为完整过程
- 输入以下命令设置排程
crontab -e
- 在文件末尾追加以下排程
# 以下6段(用空格隔开的)分别代表 分 时 日 月 年 需要运行的代码,*表示匹配所有时间段,30代表30分钟,*/1代表能被1整除的小时。所以以下排程的完整意思是每小时的30分都运行一下MEMMonitor.sh,
30 */1 * * * ./etc/profile;cd /home/p4fdc/PeakPerformance/;/home/p4fdc/PeakPerformance/MemMonitor.sh > /dev/null
Linux服务器内存监控—每小时检查&超出发送邮件&重启占用最高的Java程式的更多相关文章
- linux服务器内存、根目录使用率、某进程的监控告警脚本
脚本内容如下 #!/bin/bash #磁盘超过百分之80发送邮件告警 DISK_USED=`df -T |sed -n "2p" |awk '{print ($4/$3)*100 ...
- Linux服务器上监控网络带宽的18个常用命令nload, iftop,iptraf-ng, nethogs, vnstat. nagios,运用Ntop监控网络流量
Linux服务器上监控网络带宽的18个常用命令 本文介绍了一些可以用来监控网络使用情况的Linux命令行工具.这些工具可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度.入站流量和出站流量 ...
- 用 Python 脚本实现对 Linux 服务器的监控
目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具 比如 inotify-sync(文件系统安全监控软件).glances(资源监控工具)在实际工作中,Linux 系统 ...
- Linux 服务器系统监控脚本 Shell【转】
转自: Linux 服务器系统监控脚本 Shell - 今日头条(www.toutiao.com)http://www.toutiao.com/i6373134402163048961/ 本程序在Ce ...
- Linux服务器上监控网络带宽的18个常用命令 zz
Linux服务器上监控网络带宽的18个常用命令 本文介绍了一些可以用来监控网络使用情况的Linux命令行工具.这些工具可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度.入站流量和出站流量 ...
- Linux服务器上监控网络带宽的18个常用命令和工具
一.如何查看CentOS的网络带宽出口 检查维护系统的时候,经常会要查看服务器的网络端口是多大的,所以需要用到Linux的一个命令. 如何查看CentOS的网络带宽出口多大?可以用下面的命令来查看. ...
- Python 脚本实现对 Linux 服务器的监控
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 原文地址 由于原文来自微信公众号,并且脚本都是图片,所以这里 ...
- linux 服务器性能监控(一)
这篇文章主要介绍一些常用的linux服务器性能监控命令,包括命令的常用参数.指标的含义以及一些交互操作. 几个问题 命令本身并不复杂,关键是你对操作系统基础知识的掌握和理解,先来看看下面几个问题: C ...
- 如何使用Linux命令行查看Linux服务器内存使用情况?
一个服务器,最重要的资源之一就是内存,内存够不够用,是直接关系到系统性能的关键所在. 本文介绍如何查看Linux服务器内存使用情况, 1.free命令 free -m [root@localhost ...
随机推荐
- Hadoop 3.x 与Hadoop 2.x 的区别和优化点
Hadoop 3.x 与Hadoop 2.x 的区别和优化点 通用性 1.精简Hadoop内核,包括剔除过期的API和实现,将默认组件实现替换成最高效的实现(比如将FileOutputCommitte ...
- 状态压缩动态规划(状压DP)详解
0 引子 不要999,也不要888,只要288,只要288,状压DP带回家.你买不了上当,买不了欺骗.它可以当搜索,也可以卡常数,还可以装B,方式多样,随心搭配,自由多变,一定符合你的口味! 在计算机 ...
- SpringBoot启动注解源码流程学习总结
- JavaScript基础语法资料
JavaScript基础第01天 1 - 编程语言 1.1 编程 编程: 就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程. 计算机程序: 就是计算机所执行的一系列的 ...
- 使用 Python破解大众点评字体加密(SVG反扒)
前言 大众点评拥有大量高质量评论信息.种草信息,同时也有非常严格的反扒机制. 今天我们一起使用 Python破解大众点评字体加密,获取极具商业价值的信息. 本文知识点: requests 的使用 xp ...
- go语言开发入门
go语言开发入门 每个Go程序包含一个名为main的包以及其main函数,在初始化后,程序从main开始执行,避免引入不使用的包(编译不通过) 基础语法 基本数据类型 bool, byte int,i ...
- [ASP.NET Core开发实战]基础篇02 依赖注入
ASP.NET Core的底层机制之一是依赖注入(DI)设计模式,因此要好好掌握依赖注入的用法. 什么是依赖注入 我们看一下下面的例子: public class MyDependency { pub ...
- Fitness - 05.06
倒计时239天 运动31分钟,共计10组,3.2公里.拉伸10分钟. 每组跑步1分钟(6.4KM/h),走路2分钟(5.8KM/h). 每组跑步1分钟的锻炼和上次比起来略显轻松,因此本次锻炼的目的主要 ...
- 当年偶然发现的 Java Bug(JDK 9及之前仍未修复)
背景 15年在中信银行做持续集成时,由于当时的项目是基于三方采购的 Java 配置开发平台做的,平台自己基于 Ant 插件实现了增量和热部署. 其中有几个项目在持续集成部署时,经常发现 Linux 平 ...
- 面试【JAVA基础】JVM
1.内存模型 1.1.堆 堆是所有线程共享的,主要存放对象实例和数组. 新生代和老年代的比例是1:2. 新生代中三个区域的比例是 8 : 1 : 1. 1.1.1.新生代 对象分配在eden区中,当e ...