监控服务占用的内存并告警

严懿 197 2024-11-20

最近公司后端的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

每分钟循环执行一次,并记录日志,如果有异常占用,机器人就会发信息到企业微信部门群。