sudo nano /usr/local/bin/cpu-killguard.sh
服务器安全维护,限制挖矿CPU超载
#!/bin/bash # cpu-killguard.sh - 自动杀死高 CPU 进程以维持系统 CPU <= 80% THRESHOLD=80 # 触发阈值(百分比) SLEEP_INTERVAL=2 # 检查间隔(秒) PROTECTED_PIDS="1" # 保护 PID 列表(默认保护 init/systemd) # 添加关键系统进程到保护列表(按名称) PROTECTED_NAMES="systemd sshd cron rsyslog dbus systemd-logind systemd-journald" # 获取受保护的 PIDs for name in $PROTECTED_NAMES; do pids=$(pgrep -f "^$name$" 2>/dev/null) if [ -n "$pids" ]; then PROTECTED_PIDS="$PROTECTED_PIDS $pids" fi done # 去重并转为数组 read -r -a PROTECTED_ARRAY <<< "$(echo "$PROTECTED_PIDS" | tr ' ' '\n' | sort -u | tr '\n' ' ')" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" } is_protected() { local pid=$1 for p in "${PROTECTED_ARRAY[@]}"; do if [[ "$p" == "$pid" ]]; then return 0 fi done return 1 } while true; do # 获取整体 CPU 使用率(user + system,不含 iowait) # 使用 top -bn1 比 /proc/stat 更简单且兼容性好 cpu_line=$(top -bn1 | grep "Cpu(s)" | awk '{print $2+$4}') cpu_usage=$(printf "%.0f" "$cpu_line") # 四舍五入取整 log "当前 CPU 使用率: ${cpu_usage}%" if (( cpu_usage > THRESHOLD )); then log "⚠️ CPU 超过 ${THRESHOLD}%,正在查找最耗 CPU 的非保护进程..." # 获取所有进程的 PID 和 %CPU,按 CPU 降序排序 # 格式: %CPU PID COMMAND while IFS= read -r line; do pct_cpu=$(echo "$line" | awk '{print $1}') pid=$(echo "$line" | awk '{print $2}') comm=$(echo "$line" | awk '{for(i=12;i<=NF;i++) printf "%s ", $i; print ""}' | sed 's/ $//') # 跳过 CPU 为 0 或非数字的情况 if ! [[ "$pct_cpu" =~ ^[0-9]+(\.[0-9]+)?$ ]]; then continue fi # 跳过保护进程 if is_protected "$pid"; then continue fi # 跳过内核线程(PPid=2 或 Comm 以 [ 开头) if [[ "$comm" == \[*\] ]]; then continue fi # 找到第一个符合条件的高 CPU 进程(top 已排序) log "💀 准备杀死进程 PID=$pid, CPU=${pct_cpu}%, Command='$comm'" # 先发送 SIGTERM kill -TERM "$pid" 2>/dev/null && log "✅ 已发送 SIGTERM" sleep 2 # 如果还活着,强制 kill if kill -0 "$pid" 2>/dev/null; then kill -KILL "$pid" 2>/dev/null && log "🔥 强制 SIGKILL 发送成功" fi break # 只杀一个,避免过度反应 done < <(ps aux --sort=-%cpu | tail -n +2) # 跳过 header # 杀完等 5 秒再检查 sleep 5 else sleep "$SLEEP_INTERVAL" fi done
ctrl+o 回车 ctrl+c退出保存
执行权限,否则无法后台运行
sudo chmod +x /usr/local/bin/cpu-killguard.sh
测试
sudo /usr/local/bin/cpu-killguard.sh
sudo tee /etc/systemd/system/cpu-killguard.service << 'EOF' [Unit] Description=CPU Kill Guard - 自动杀死高 CPU 进程以维持系统稳定 After=multi-user.target [Service] Type=simple ExecStart=/usr/local/bin/cpu-killguard.sh Restart=always RestartSec=10 StandardOutput=journal StandardError=journal # 可选:指定运行用户(建议用 root,因需 kill 其他进程) User=root [Install] WantedBy=multi-user.target EOF
# 重载 systemd 配置 sudo systemctl daemon-reload # 启用开机自启 sudo systemctl enable cpu-killguard.service # 立即启动服务 sudo systemctl start cpu-killguard.service