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

RabbitMQ内存监控及自动重启

这个脚本是用来监控 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 我可以给你一个示例:#!/bin/bash# 安装并动Nacos服务 yum install nacos -y systemctl start nacos# 安装并动Redis服务 yum install redis -y systemctl start redis# 安装并RabbitMQ服务 yum install rabbitmq-server -y systemctl start rabbitmq-server ### 回答2: 可以编写一个名为start_services.sh的shell脚本来实现自动动nacos、redis和rabbitmq服务。 ```shell #!/bin/bash # 动nacos服务 echo "Starting Nacos server..." cd /path/to/nacos # 替换为nacos的安装路径 ./startup.sh & # 动redis服务 echo "Starting Redis server..." redis-server & # rabbitmq服务 echo "Starting RabbitMQ server..." rabbitmq-server & echo "All services started successfully!" ``` 这个脚本首先进入nacos的安装路径,然后执行动nacos的脚本startup.sh,并使用"&"符号将其放入后台运行。接着动redis-server和rabbitmq-server服务,并同样将它们放入后台运行。 保存以上脚本为start_services.sh文件,并在命令行中执行以下命令来运行脚本: ```shell chmod +x start_services.sh # 添加可执行权限 ./start_services.sh # 运行脚本 ``` 执行脚本后,会在命令行中显示相应的提示信息,确认所有服务已成功动。 ### 回答3: 可以编写以下的Shell脚本自动动Nacos、Redis、RabbitMQ服务: ```bash #!/bin/bash # 动Nacos服务 nacos_start() { echo "Starting Nacos..." # TODO: 添加动Nacos的命令 } # 动Redis服务 redis_start() { echo "Starting Redis..." # TODO: 添加动Redis的命令 } # RabbitMQ服务 rabbitmq_start() { echo "Starting RabbitMQ..." # TODO: 添加RabbitMQ的命令 } # 主函数 main() { echo "Starting services..." # 调用函数动各个服务 nacos_start redis_start rabbitmq_start echo "All services are started!" } # 调用主函数 main ``` 在上述脚本中,我们定义了三个函数来动Nacos、Redis和RabbitMQ服务,并在主函数中按顺序调用了这些函数。你需要根据实际情况,将每个服务动的命令填充到对应的函数中。同时,你还可以根据需要添加其他的服务动函数或修改脚本中的输出信息。最后,通过在终端中执行该脚本,即可自动动这三个服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Energet!c

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值