最近公司后端的SprintBoot程序在运行的时候经常由于内存不够用而导致服务异常。
写了 一个脚本程序监控服务每分钟占用的内存值,超过某个值就报警,并通过企业微信的机器人将超过的预警值发送到部门群,以做后续的预备事项。
脚本如下
#!/bin/bash
# 初始日期
currentDate=$(date '+%Y-%m-%d')
# 生成日志文件路径,包含日期
logDir="/data/checkJavaMemLog"
logFile="$logDir/logFile_$currentDate.txt"
while true; do
# 获取当前日期
newDate=$(date '+%Y-%m-%d')
# 如果日期变了,更新日志文件名,并且删除文件,只保留最近七天的文件
if [ "$newDate" != "$currentDate" ]; then
currentDate=$newDate
logFile="$logDir/logFile_$currentDate.txt"
find "$logDir/" -type f -mtime +7 -exec rm -f {} \; # 只保留最近七天的文件
fi
keyWords=hydrau #关键字找jar包的名称
javaPid=$(ps -ef | grep java | grep "$keyWords" | awk 'NR==1 {print $2}') #取出jar包的主进程号
javaPidMem=$(ps -p "$javaPid" -o rss | tail -n 1 | awk '{print $1/1024 " MB"}') #通过主进程号查询内存的占用量以为MB为单位
integerPart=$(echo $javaPidMem | awk '{print int($1)}') #分割内存的字符串,只保留前4位整数,去除MB
if [ "$integerPart" -gt 1800 ]; then
# 如果大于 1800,则将特定日志写入指定文件,并告警
echo "$(date '+%Y-%m-%d %H:%M:%S') - 警告检测系统Java PID Mem大于1800: $integerPart MB" >> "$logFile"
curl "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=2dadec34-48d8-45a0-9ec5-40e9927dc35f" \
-H "Content-Type: application/json" \
-d "
{
\"msgtype\": \"text\",
\"text\": {
\"content\": \"警告检测系统后端当前内存占用量大于1800MB,目前为$integerPart MB。。。。。\"
}
}" #机器人通知
else
# 打印当前内存占用量到日志文件
echo "$(date '+%Y-%m-%d %H:%M:%S') - 检测系统Java PID Mem当前为: $javaPidMem" >> "$logFile"
fi
sleep 60
done
将脚本赋予执行权限,给脚本的起的名字为checkPid.sh
chmod +x checkPid.sh
放到后台运行命令
nohup ./checkPid.sh > checkJavaMemLog/logFile.txt 2>&1
每分钟循环执行一次,并记录日志,如果有异常占用,机器人就会发信息到企业微信部门群。