银河麒麟系统可通过systemd timer轮询脚本实现进程高负载自动终止:每30秒检测目标进程cpu使用率,超85%即kill -9,并记录日志;配置后永久生效,兼容桌面与服务器环境。

你希望银河麒麟系统在检测到某个进程持续占用过高CPU或内存时,自动将其终止,防止拖垮整机响应、卡死桌面或挤占关键服务资源。这不能依赖系统自带电源管理,必须通过脚本实时监控+条件触发实现。
用systemd timer轮询并杀掉高负载进程
该方案不依赖图形界面,适配桌面与服务器环境,每30秒检查一次目标进程的CPU使用率,超阈值即强制终止,配置后永久生效。
第一步:创建监控脚本 sudo nano /usr/local/bin/kill-if-overload.sh
第二步:写入以下内容(以 firefox 为例,CPU阈值设为85%,持续超限即杀):
#!/bin/bash
PID=$(pgrep -f "firefox")
if [ -n "$PID" ]; then
LOAD=$(ps -o %cpu= -p $PID 2>/dev/null | awk '{print int($1)}')
if [ "$LOAD" -gt 85 ]; then
kill -9 $PID
logger "Killed firefox (PID $PID) due to CPU overload: ${LOAD}%"
fi
fi
第三步:赋予执行权限 sudo chmod +x /usr/local/bin/kill-if-overload.sh
第四步:创建timer单元 sudo nano /etc/systemd/system/overload-killer.timer,填入:
[Unit]
Description=Kill process on CPU overload
[Timer]
OnBootSec=1min
OnUnitActiveSec=30s
[Install]
WantedBy=timers.target
第五步:创建对应service单元 sudo nano /etc/systemd/system/overload-killer.service,填入:
[Unit]
Description=CPU overload killer
After=multi-user.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/kill-if-overload.sh
User=root
[Install]
WantedBy=multi-user.target
第六步:启用并启动 sudo systemctl daemon-reload && sudo systemctl enable --now overload-killer.timer
用crontab每分钟检测内存超限进程
适合对内存敏感的场景,比如Java程序常因堆溢出导致RSS飙升却CPU不高,此法专盯内存占用。
打开终端,执行 crontab -e
新增一行(监测 java 进程,RSS超1.2GB即杀):
*/1 * * * * PID=$(pgrep -f "java"); if [ -n "$PID" ] && [ $(ps -o rss= -p $PID 2>/dev/null | awk '{printf "%d", /1024}') -gt 1200 ]; then kill -9 $PID; logger "Killed java (PID $PID) for RSS >1200MB"; fi
【注意:crontab中不能换行,整条命令必须写在同一行;ps输出单位是KB,需除以1024转MB】
方法一:用pidstat + shell脚本做精细控制
若需同时监控CPU和内存,并支持白名单、冷却期等逻辑,直接写一个带状态记录的脚本更可靠。
执行 sudo nano /usr/local/bin/smart-killer.sh
粘贴以下内容(会记录上次杀进程时间,避免1分钟内重复触发):
#!/bin/bash
PROC_NAME="chrome"
MAX_CPU=90
MAX_RSS_MB=1500
COOLDOWN_SEC=120
STATE_FILE="/var/run/smart-killer.state"
if [ -f "$STATE_FILE" ]; then
LAST_KILL=$(cat "$STATE_FILE")
if [ $(($(date +%s) - $LAST_KILL)) -lt $COOLDOWN_SEC ]; then exit 0; fi
fi
PID=$(pgrep -f "$PROC_NAME")
if [ -z "$PID" ]; then exit 0; fi
CPU=$(pidstat -p $PID 1 1 | awk '/^[0-9]/ {print int($8)}' | tail -1)
RSS_MB=$(ps -o rss= -p $PID 2>/dev/null | awk '{printf "%d", $1/1024}')
if [ "$CPU" -gt "$MAX_CPU" ] || [ "$RSS_MB" -gt "$MAX_RSS_MB" ]; then
echo $(date +%s) > "$STATE_FILE"
kill -9 $PID
logger "Smart-killer terminated $PROC_NAME (PID $PID): CPU=${CPU}%, RSS=${RSS_MB}MB"
fi
执行 sudo chmod +x /usr/local/bin/smart-killer.sh
再执行 sudo crontab -e,添加:
*/2 * * * * /usr/local/bin/smart-killer.sh
方法二:用systemctl --scope临时限制进程资源
这不是“停止”,而是从根源压制——让进程根本无法冲高负载,比事后杀死更优雅,适用于已知要长期运行但必须控资源的程序。
假设你要运行一个python脚本,但只允许它最多用1核CPU和800MB内存:
执行:
systemctl --scope --scope-property=CPUQuota=50% --scope-property=MemoryLimit=800M python3 /path/to/script.py &
【CPUQuota=50% 表示最多用半颗物理核的算力,不是50%总CPU;MemoryLimit超出即OOM Killer介入】
如需持久化,可将该命令写入开机自启服务或桌面启动项。











