RabbitMQ内存监控及自动重启的shell脚本

RabbitMQ内存监控及自动重启

    • 功能简介
    • Shell脚本
    • systemd托管

这个脚本是用来监控 RabbitMQ 进程的内存占用情况,如果内存占用超过设定的阈值并且达到设定的检查次数,则自动重启 RabbitMQ 服务。

功能简介

脚本的具体功能如下:

获取 RabbitMQ 进程的 PID;
检查 RabbitMQ 服务状态,如果服务没有运行则启动服务;
检查 RabbitMQ 进程的内存占用情况;
如果内存占用超过设定的阈值,则计数器加1;
如果连续检查超过设定次数和内存占用都超过阈值,则重启 RabbitMQ 服务。

Shell脚本

需要手动创建日志文件:/mnt/data/rmq-memchecker/rmq-memchecker.log

#!/bin/bash
# author wuzw

# 日志文件路径
log_file="/mnt/data/rmq-memchecker/rmq-memchecker.log"
# RabbitMQ进程名
rabbitmq_process_name="beam.smp"
# 检查间隔时间(秒)
check_interval=30
# 检查次数
check_times=999999999
# 内存阈值(MB)
memory_threshold=999999999



# 重启RabbitMQ服务
function restart_rabbitmq() {
    # 记录日志
    echo "$(date '+%Y-%m-%d %H:%M:%S'): 检查 RabbitMQ 进程内存持续超过${memory_threshold}MB,并且到达了设定的$check_times 次,正在重启RabbitMQ服务..." >> $log_file
    
    # 重启RabbitMQ服务
    sudo systemctl restart rabbitmq-server
    
    # 等待RabbitMQ服务重启完成
    sleep 5
    
    # 检查RabbitMQ服务状态
    rabbitmq_status=$(systemctl status rabbitmq-server | grep "Active:" | awk '{print $2}')
    
    # 判断RabbitMQ服务状态
    if [ "$rabbitmq_status" = "active" ]; then
    # 记录日志
    echo "$(date '+%Y-%m-%d %H:%M:%S'): 检查 RabbitMQ 服务状态正常,当前状态为$rabbitmq_status" >> $log_file
    else
    # 记录日志
    echo "$(date '+%Y-%m-%d %H:%M:%S'): 检查 RabbitMQ 服务状态异常,当前状态为$rabbitmq_status 正在启动RabbitMQ服务..." >> $log_file
    # 启动RabbitMQ服务
    sudo systemctl start rabbitmq-server
    fi
}



# 若pid不存在尝试启动服务
function check_pid() {
    rabbitmq_pid=$(pgrep -f $rabbitmq_process_name)
    if [ -z "$rabbitmq_pid" ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S'): 检查 RabbitMQ 进程PID不存在,正在查询服务状态" >> $log_file
    fi
}
function check_status() {
    # 获取RabbitMQ服务状态
    rabbitmq_status=$(systemctl is-active rabbitmq-server)
    if [ "$rabbitmq_status" = "active" ]; then
        # 记录日志
        echo "$(date '+%Y-%m-%d %H:%M:%S'): 检查 RabbitMQ 服务状态为 $rabbitmq_status ,进程PID是 $rabbitmq_pid 继续检查进程内存占用" >> $log_file
        else
            # 记录日志
            echo "$(date '+%Y-%m-%d %H:%M:%S'): 检查 RabbitMQ 服务状态为 $rabbitmq_status,正在启动RabbitMQ服务..." >> $log_file
            sudo systemctl start rabbitmq-server
            rabbitmq_pid=$(pgrep -f $rabbitmq_process_name)
            echo "$(date '+%Y-%m-%d %H:%M:%S'): 检查 RabbitMQ 服务状态为 $rabbitmq_status ,进程PID是 $rabbitmq_pid 继续检查进程内存占用" >> $log_file
            #exit 1
    fi
}

# 初始化计数器
counter=0

# 进入循环
while true
do
    check_pid
    check_status
    # 获取RabbitMQ进程的内存使用(单位:MB)
    # 当内存使用大于1024MB之后,top查询出为1.6g,使用top进行换算的时候存在问题
    # rabbitmq_memory=$(top -p "$rabbitmq_pid" -b -n 1 | grep $rabbitmq_process_name | awk '{print $6}')
    rabbitmq_memory=$(ps -p "$rabbitmq_pid" -o pid,rss --no-headers | awk '{print $2/1024}')
    echo "$(date '+%Y-%m-%d %H:%M:%S'): 进程 $rabbitmq_process_name 使用了内存 $rabbitmq_memory MB 当前PID是 $rabbitmq_pid " >> $log_file

    # 判断内存使用是否超过阈值
    if [ $(echo "$rabbitmq_memory > $memory_threshold" | bc -l) -eq 1 ]; then
        ((counter++))
        echo "$(date '+%Y-%m-%d %H:%M:%S'): 进程 $rabbitmq_process_name 使用了内存 $rabbitmq_memory MB,设定值为 $memory_threshold MB,当前是第 $counter 次,当达到设定值 $check_times 进行服务重启" >> $log_file
        else
            counter=0
    fi
    
    # 若连续检查两次内存使用超过阈值则重启RabbitMQ服务
    if [ $counter -ge $check_times ]; then
        restart_rabbitmq
        counter=0
    fi
    
    # 等待一定时间
    sleep $check_interval

done

systemd托管

vi /usr/lib/systemd/system/rmq-memchecker.service
[Unit]
Description = Monitor the process status and memory usage of beam.smp, and restart it when conditions are met.

[Service]
Type = simple
ExecStart =/bin/bash /etc/rmq-memchecker/rmq-memchecker.sh
[Install]
WantedBy = multi-user.target

你可能感兴趣的:(Shell,RabbitMQ,rabbitmq,bash)