写一个脚本呢文件 :内存使用率达到98% 后重启 docker 服务
monitor_docker_memory.sh
#!/bin/bash
# 配置项
THRESHOLD=98 # 内存使用率阈值 (%)
LOG_FILE="/var/log/docker_memory_monitor.log"
DOCKER_SERVICE="docker"
# 获取内存信息 (单位: kB)
get_memory_usage() {
local mem_total=$(grep '^MemTotal:' /proc/meminfo | awk '{print $2}')
local mem_available=$(grep '^MemAvailable:' /proc/meminfo | awk '{print $2}')
# 如果系统内核较老没有 MemAvailable,则用 Free + Buffers + Cached 估算
if [ -z "$mem_available" ]; then
local mem_free=$(grep '^MemFree:' /proc/meminfo | awk '{print $2}')
local buffers=$(grep '^Buffers:' /proc/meminfo | awk '{print $2}')
local cached=$(grep '^Cached:' /proc/meminfo | awk '{print $2}')
mem_available=$((mem_free + buffers + cached))
fi
local mem_used=$((mem_total - mem_available))
local usage_percent=$((mem_used * 100 / mem_total))
echo $usage_percent
}
# 主逻辑
current_usage=$(get_memory_usage)
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$timestamp] 当前内存使用率:${current_usage}%" >> $LOG_FILE
if [ "$current_usage" -ge "$THRESHOLD" ]; then
echo "[$timestamp] 警告:内存使用率 (${current_usage}%) 超过阈值 (${THRESHOLD}%),正在重启 Docker 服务..." >> $LOG_FILE
# 尝试释放页缓存以争取重启所需的少量内存 (可选优化)
sync; echo 3 > /proc/sys/vm/drop_caches 2>/dev/null
# 重启 Docker 服务
if systemctl restart $DOCKER_SERVICE; then
echo "[$timestamp] 成功:Docker 服务已重启。" >> $LOG_FILE
else
echo "[$timestamp] 错误:Docker 服务重启失败,请手动检查。" >> $LOG_FILE
fi
fi
创建日志文件并授权
touch /var/log/docker_memory_monitor.log
chmod 644 /var/log/docker_memory_monitor.log
vi /etc/crontab
* * * * * root sh /mnt/data/zzy/scripts/monitor_docker_memory.sh
欢迎来撩 : 汇总all
