#!/usr/bin/env bash # 停止 GPU worker(由 run_worker.sh 后台启动的进程)。 # 优先用 worker.pid;找不到则按端口兜底查找。 set -euo pipefail cd "$(dirname "$0")" PID_FILE="worker.pid" PORT="${PORT:-8187}" stop_pid() { local pid="$1" if kill -0 "$pid" 2>/dev/null; then echo ">> 停止 worker (PID $pid)" kill "$pid" # 等待优雅退出,最多 10 秒 for _ in $(seq 1 10); do kill -0 "$pid" 2>/dev/null || return 0 sleep 1 done echo ">> 未在 10 秒内退出,强制 kill -9" kill -9 "$pid" 2>/dev/null || true fi } # 1) 用 PID 文件 if [ -f "$PID_FILE" ]; then PID="$(cat "$PID_FILE")" if [ -n "$PID" ] && kill -0 "$PID" 2>/dev/null; then stop_pid "$PID" rm -f "$PID_FILE" echo ">> 已停止" exit 0 fi rm -f "$PID_FILE" fi # 2) 兜底:按监听端口查找 PIDS="$(ss -tlnp 2>/dev/null | grep ":${PORT} " | grep -oE 'pid=[0-9]+' | grep -oE '[0-9]+' | sort -u || true)" if [ -n "$PIDS" ]; then for p in $PIDS; do stop_pid "$p"; done echo ">> 已停止(按端口 ${PORT} 查找)" exit 0 fi echo ">> 没有发现正在运行的 worker(端口 ${PORT})"