应使用 free 命令的 available 值计算内存占比:available / total × 100,取整后若低于 10 则触发打印;available 位于 free -m 输出第四行,比 free + buff/cache 更准确反映可分配内存。

直接用 free 算出可用内存占比,再结合 ps 排序取前 10,就能实现“低于 10% 时触发打印”——不需要轮询、不依赖外部工具(如 smem),纯 Bash 就够用。
怎么算“剩余内存低于10%”
关键不是看 free 输出里的 free 列,而是 available(Linux 3.14+ 内核都支持)。它代表当前可立即分配给新进程的物理内存,比 free + buff/cache 更准。
-
available值来自free -m第四行(MiB Mem)或free -g的GiB Mem行,字段顺序固定 - 计算公式:
available / total * 100,结果取整后判断是否 10 - 注意:某些老系统(如 CentOS 6)内核无
available字段,得退回到free + buffers + cached估算,但这类系统基本不推荐用于生产监控
怎么只在触发时打印 top10 进程
别用 top -b -n1 配合 awk 解析——它的输出列宽不固定,字段易错位;改用 ps 直接按 rss(即 RES)排序更稳。
- 命令:
ps -eo pid,user,%mem,rss,comm --sort=-rss | head -n 11 -
-eo指定输出字段,--sort=-rss表示按 RSS 降序(-是降序符号) -
head -n 11是因为第一行是表头,真正进程占 10 行 - 避免用
%MEM排序:它受总内存影响大,小内存机器上一个 100MB 进程可能显示 20%,而大内存机器上同样大小只占 0.5%,排序失真
完整脚本怎么写才可靠
把判断和打印包进一个条件块里,不写死循环,方便手动调用或集成进 cron。下面这段可直接保存为 check_lowmem.sh:
#!/bin/bash
# 获取 available 和 total(单位 KB)
read total _ _ _ _ _ _ _ _ _ available _ 计算可用率(整数,避免浮点)<p>pct=$((available * 100 / total))</p><p>if [ $pct -lt 10 ]; then
echo "[$(date '+%F %T')] WARNING: memory available is only ${pct}%"
ps -eo pid,user,%mem,rss,comm --sort=-rss | head -n 11
fi</p>
- 直接读
/proc/meminfo比跑free更轻量、无兼容问题 - 没加
sleep或while:避免后台常驻进程干扰;需要周期检查就交给cron,例如每 5 分钟跑一次:*/5 * * * * /path/to/check_lowmem.sh >> /var/log/lowmem.log 2>&1 - 输出带时间戳,方便追查发生时刻;
%mem列保留,用于交叉验证单个进程对整体的影响比例
实际部署时最容易被忽略的是:/proc/meminfo 中的 available 字段在极少数定制内核或容器环境里可能缺失,建议先手动执行 grep -i available /proc/meminfo 确认存在再上线脚本。











