该脚本通过监控RSS内存使用量主动终止超标进程。以THRESHOLD_MB为阈值,排除内核线程、PID=1及自身,优先SIGTERM软终止,支持--force强制SIGKILL,每次仅杀RSS最高者,5秒轮询一次。

在Linux服务器长期运行中,某些进程可能因内存泄漏或异常行为持续占用大量内存,导致系统响应迟缓甚至OOM(Out of Memory)被内核强制终止关键服务。与其被动等待OOM Killer介入,不如主动监控并按需清理——下面是一个轻量、可靠、可定制的守护脚本方案。
核心逻辑:按RSS阈值识别并安全终止进程
脚本不依赖复杂框架,仅用标准shell命令(ps、awk、kill)实现闭环监控。关键点在于:
- 以RSS(Resident Set Size)为判断依据,真实反映进程当前占用的物理内存,比VSZ更准确
- 排除内核线程(comm字段含方括号)、init进程(PID=1)及脚本自身,避免误杀
- 默认使用SIGTERM发送软终止信号,给予进程正常清理资源的机会;可选加--force启用SIGKILL
- 每次只杀一个超标进程(RSS最高者),防止连锁崩溃,且5秒后才进行下一轮检测
脚本内容(保存为memwatch.sh)
复制以下代码,赋予执行权限:chmod +x memwatch.sh
#!/bin/bash
# memwatch.sh — 内存超限进程自动清理守护脚本
THRESHOLD_MB=${1:-500} # 默认阈值500MB,可传参覆盖,如 ./memwatch.sh 800
SLEEP_SEC=${2:-5} # 检测间隔,默认5秒
FORCE_KILL=${3:-false} # 第三个参数设为"true"启用强制杀死
<p>log() { echo "$(date '+%Y-%m-%d %H:%M:%S') | $*"; }</p><p>while true; do</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6580" title="Linux installer"><img
src="https://img.php.cn/upload/skill/000/000/081/179101817874041.jpg" alt="Linux installer" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill6580" title="Linux installer" class="overflowclass">Linux installer</a>
<p class="overflowclass">先解析安全源,运行本地CLI安装、启动、卸载Linux桌面应用。用户请求时使用。</p>
</div>
<a rel="nofollow" href="/xiazai/skill6580" title="Linux installer" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><h1>查找RSS > 阈值(单位KB)的用户进程(排除内核线程和PID 1)</h1><p>TARGET=$(ps -eo pid,rss,comm --no-headers | \
awk -v th=$((THRESHOLD_MB * 1024)) '
$2 > th && $1 != 1 && substr($3,1,1) != "[" { print $0 }' | \
sort -k2,2nr | head -n1)</p><p>if [ -n "$TARGET" ]; then
PID=$(echo "$TARGET" | awk '{print $1}')
RSS_KB=$(echo "$TARGET" | awk '{print $2}')
COMM=$(echo "$TARGET" | awk '{print $3}')</p><pre class="brush:php;toolbar:false;">log "⚠️ 超标进程: PID=$PID, RSS=$((RSS_KB/1024))MB, CMD=$COMM"
if [ "$FORCE_KILL" = "true" ]; then
kill -9 "$PID" 2>/dev/null && log "✅ 强制终止成功 (SIGKILL)"
else
kill "$PID" 2>/dev/null && log "✅ 发送终止信号 (SIGTERM)"
fifi
sleep "$SLEEP_SEC" done
部署为系统级守护服务(推荐systemd)
创建服务单元文件/etc/systemd/system/memwatch.service:
[Unit] Description=Memory Watchdog Service After=network.target <p>[Service] Type=simple User=root ExecStart=/path/to/memwatch.sh 600 3 false Restart=always RestartSec=10 StandardOutput=journal StandardError=journal</p><p>[Install] WantedBy=multi-user.target </p>
启用并启动:
- systemctl daemon-reload
- systemctl enable --now memwatch.service
- 查看日志:journalctl -u memwatch.service -f
安全增强与实用建议
生产环境使用前请确认以下事项:
- 先在测试环境运行脚本,用ps aux --sort=-%mem | head -10人工核对RSS是否匹配预期
- 避免将阈值设得过低(如
- 如需保护特定进程,可在awk过滤条件中追加&& $3 !~ /^(java|nginx|mysqld)$/
- 配合free -h和cat /proc/meminfo定期验证整体内存趋势,区分是单进程问题还是内存碎片/缓存堆积










