您的位置 首页 shell脚本

linux 当内存达到90%后自动清理内存

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

白眉大叔

关于白眉大叔linux云计算: 白眉大叔

热门文章