监听服务内存占用并重启服务器

设置日志文件夹

mkdir /data/log/
chmod -R 775 /data/log/
chown -R nobody.nobody /data/log/

# 创建日志
touch monitor_memory.log
# 让 www 用户可写入
chown www monitor_memory.log

编写脚本

cd /data/tasks_command/
vim monitor_memory.sh

写入内容

#!/bin/bash

# 日志文件路径
LOG_FILE="/data/log/monitor_memory.log"

# 获取总内存和已使用内存
total_mem=$(free -m | awk '/^Mem:/{print $2}')
used_mem=$(free -m | awk '/^Mem:/{print $3}')

# 获取当前时间
CURRENT_TIME=$(date '+%Y-%m-%d %H:%M:%S')

# 计算内存使用率
usage_percent=$(awk "BEGIN {printf \"%.2f\", ($used_mem/$total_mem)*100}")

# 内存使用超过75%时记录并重启
if (( $(echo "$usage_percent > 75" | bc -l) )); then
    echo "$CURRENT_TIME: Memory usage is ${usage_percent}%" >> "$LOG_FILE"
    echo "Top 5 memory consuming processes:" >> "$LOG_FILE"
    
    # 获取内存占用最高的前5个进程并记录
    ps aux --sort=-%mem | awk 'NR<=6{print $0}' >> "$LOG_FILE"
    
    # 重新平滑启动服务器(如使用systemctl)
    echo "$CURRENT_TIME: Restarting server..." >> "$LOG_FILE"
    # 如果你想平滑重启服务(如web服务),可使用相应的命令,比如 systemctl restart your_service_name
    # 如果需要重启整个服务器,请注意实际应用场景
    # sudo reboot

    # 平滑重启服务器的脚本
    sudo /sbin/reboot
fi

 

配置和执行

赋予执行权限:

chmod +x monitor_memory.sh
chmod 777 monitor_memory.sh

使用 Crontab 定期执行此脚本并将输出记录到日志文件中。你可以通过以下步骤配置定时任务:

crontab -e

添加以下行到 crontab 文件中:

# 监听内容占用
* * * * * /data/tasks_command/monitor_memory.sh