> 文章列表 > RabbitMQ内存监控及自动重启的shell脚本

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

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_fileelse# 记录日志echo "$(date '+%Y-%m-%d %H:%M:%S'): 检查 RabbitMQ 服务状态异常,当前状态为$rabbitmq_status 正在启动RabbitMQ服务..." >> $log_file# 启动RabbitMQ服务sudo systemctl start rabbitmq-serverfi
}# 若pid不存在尝试启动服务
function check_pid() {rabbitmq_pid=$(pgrep -f $rabbitmq_process_name)if [ -z "$rabbitmq_pid" ]; thenecho "$(date '+%Y-%m-%d %H:%M:%S'): 检查 RabbitMQ 进程PID不存在,正在查询服务状态" >> $log_filefi
}
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_fileelse# 记录日志echo "$(date '+%Y-%m-%d %H:%M:%S'): 检查 RabbitMQ 服务状态为 $rabbitmq_status,正在启动RabbitMQ服务..." >> $log_filesudo systemctl start rabbitmq-serverrabbitmq_pid=$(pgrep -f $rabbitmq_process_name)echo "$(date '+%Y-%m-%d %H:%M:%S'): 检查 RabbitMQ 服务状态为 $rabbitmq_status ,进程PID是 $rabbitmq_pid 继续检查进程内存占用" >> $log_file#exit 1fi
}# 初始化计数器
counter=0# 进入循环
while true
docheck_pidcheck_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_fileelsecounter=0fi# 若连续检查两次内存使用超过阈值则重启RabbitMQ服务if [ $counter -ge $check_times ]; thenrestart_rabbitmqcounter=0fi# 等待一定时间sleep $check_intervaldone

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