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

浙公网安备 33010602011771号