Linux | 如何杀掉一直抢占服务器的程序


(仅供学习交流,不作为行为建议)


假设出现已经被禁用的账号 反复抢占服务器资源,我们希望可以自动将这些进程杀掉,从而释放服务器资源。可以通过部署一个脚本的方式来做到。


脚本内容

创建脚本 /usr/local/bin/process_monitor.sh:

#!/bin/bash

# 配置
LOG_FILE="/var/log/process_monitor.log"
CHECK_INTERVAL=5  # 检测间隔(秒)

# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# 杀死进程函数
kill_processes() {
    local user=$1
    local pattern=$2
    local count=$(pgrep -u "$user" -f "$pattern" | wc -l)
    
    if [ $count -gt 0 ]; then
        log "⚠️  发现 $user 用户的 $pattern 进程 ($count 个),正在终止..."
        sudo pkill -u "$user" -f "$pattern"
        sleep 2
        # 检查是否还有残留,强制杀死
        if pgrep -u "$user" -f "$pattern" > /dev/null; then
            log "🔨 强制终止残留进程..."
            sudo pkill -9 -u "$user" -f "$pattern"
        fi
        log "✅ $user 的 $pattern 进程已清理"
    fi
}

# 主循环
log "🚀 进程监控服务已启动"

while true; do
    # 检测 user1 用户的 VLLM 或 TP 进程
    kill_processes "user1" "vllm"
    kill_processes "user1" "tp"

    # 检测 user2 用户的 conda 或 cursor 进程
    kill_processes "user2" "conda"
    kill_processes "user2" "cursor"

    sleep $CHECK_INTERVAL
done

如何部署这个脚本

1 创建并授权脚本

sudo mkdir -p /usr/local/bin
sudo tee /usr/local/bin/process_monitor.sh > /dev/null << 'EOF'
# 粘贴上面的脚本内容
EOF
# 其实直接放到 ~ 目录下,也不是不行
sudo chmod +x /usr/local/bin/process_monitor.sh
sudo touch /var/log/process_monitor.log
sudo chmod 666 /var/log/process_monitor.log

2 后台运行方式

(其实可以直接 tmux 跑)

方案 A:使用 nohup(简单)

nohup sudo /usr/local/bin/process_monitor.sh > /dev/null 2>&1 &
echo $! > /var/run/process_monitor.pid

方案 B:使用 systemd(推荐,生产环境)

sudo tee /etc/systemd/system/process-monitor.service > /dev/null << 'EOF'
[Unit]
Description=Process Monitor Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/process_monitor.sh
Restart=always
RestartSec=10
User=root
Group=root

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable process-monitor
sudo systemctl start process-monitor

方案 C:使用 screen(可交互)

screen -dmS process_monitor sudo /usr/local/bin/process_monitor.sh

3 监控与管理

查看日志:

# 实时查看
tail -f /var/log/process_monitor.log

# 查看最近 50 条
tail -50 /var/log/process_monitor.log

# 搜索特定内容
grep "VLLM\|conda" /var/log/process_monitor.log

管理服务:

# systemd 方式
sudo systemctl status process-monitor
sudo systemctl stop process-monitor
sudo systemctl restart process-monitor

# nohup 方式
kill $(cat /var/run/process_monitor.pid)

# screen 方式
screen -r process_monitor  # 进入
Ctrl+A, D                  # 退出

查看当前监控状态:

ps aux | grep process_monitor | grep -v grep


posted @ 2026-04-02 19:26  MoonOut  阅读(40)  评论(0)    收藏  举报