这个脚本是用来监控 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