linux 当内存达到90%后自动清理内存
sudo vim /usr/local/sbin/smart_mem_cleaner.sh
内容如下:
版本1:
#!/bin/bash
# 设置内存阈值(例如90%)
THRESHOLD=90
# 日志记录函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> /var/log/mem_cleaner.log
}
# --- 修正后的内存计算逻辑 ---
# 获取 Mem: 这一行的数据
mem_line=$(free | awk '/^Mem:/')
# 提取总内存和空闲内存(包括buff/cache后的可用内存)
total_mem=$(echo "$mem_line" | awk '{print $2}')
free_mem=$(echo "$mem_line" | awk '{print $7}') # $7 是 available 列(在free -h中是第6列,但awk默认分隔符下是第7个字段)
# 计算使用率:(总内存 - 可用内存) / 总内存
# 使用 awk 进行浮点运算并四舍五入
mem_usage=$(awk "BEGIN {printf \"%.0f\", (($total_mem - $free_mem) / $total_mem) * 100}")
log "当前内存使用率: ${mem_usage}% (总内存: ${total_mem}K, 可用内存: ${free_mem}K)"
# 判断是否超过阈值
if [ "$mem_usage" -ge "$THRESHOLD" ]; then
log "警告:内存使用率超过 ${THRESHOLD}%,开始清理缓存..."
# 1. 同步数据到磁盘
sync
# 2. 清理缓存
echo 3 > /proc/sys/vm/drop_caches
log "缓存清理完成。"
else
log "内存使用正常,无需清理。"
fi
版本2: (在一些系统上出现- 值 )
#!/bin/bash
# 智能内存清理脚本
# 设置内存阈值(例如90%)
THRESHOLD=90
# 获取当前内存使用率(去掉百分号)
# 注意:这里计算的是 used/(total+buffer/cache),更符合直观感受
MEM_USAGE=$(free | awk '/^Mem/ {printf("%.0f"), ($3-$6-$7)/($2-$6-$7)*100}')
# 日志记录函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> /var/log/mem_cleaner.log
}
log "当前内存使用率: ${MEM_USAGE}%"
# 如果内存使用率超过阈值
if [ "$MEM_USAGE" -ge "$THRESHOLD" ]; then
log "警告:内存使用率超过 ${THRESHOLD}%,开始清理缓存..."
# 1. 同步数据到磁盘,防止数据丢失
sync
# 2. 清理页面缓存、目录项和inode缓存
# 数值3代表清理所有缓存 (1=页面缓存, 2=目录项和inode, 3=1+2)
echo 3 > /proc/sys/vm/drop_caches
# 3. 可选:如果配置了Swap,且使用率过高,也可以关闭再开启Swap
# SWAP_USAGE=$(free | awk '/^Swap/ {printf("%.0f"), $3/$2*100}')
# if [ "$SWAP_USAGE" -ge 50 ]; then
# swapoff -a && sleep 1 && swapon -a
# log "Swap空间已清理"
# fi
log "缓存清理完成。"
else
log "内存使用正常,无需清理。"
fi

赋权:
sudo chmod +x /usr/local/sbin/smart_mem_cleaner.sh
定时:
# 每5分钟检查一次内存使用情况
*/5 * * * * /usr/local/sbin/smart_mem_cleaner.sh
欢迎来撩 : 汇总all
