#!/usr/bin/env bash # 停止 start.sh 起的三个服务:用户侧 API(8770) + 后台 API(8771) + 前端(3001)。 # 双保险:先按 start.sh 落的 PID 文件杀,再按端口兜底(Windows 走 PowerShell,mac 走 lsof)。 # (PG 若由 brew 自启,本脚本不停它。) SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" LOG_DIR="$SCRIPT_DIR/.run-logs" case "$(uname -s)" in MINGW* | MSYS* | CYGWIN*) IS_WIN=1 ;; *) IS_WIN=0 ;; esac # 1) 按 PID 文件杀(start.sh 启动时落的 MSYS/进程 PID) for name in user-api admin-api admin-web; do pf="$LOG_DIR/$name.pid" [ -f "$pf" ] || continue pid="$(cat "$pf" 2>/dev/null)" [ -n "$pid" ] && kill -9 "$pid" 2>/dev/null && echo " $name: 杀 PID $pid" rm -f "$pf" done # 2) 按端口兜底(catch 掉 reload 子进程 / 孤儿 node 等) kill_port() { local p="$1" if [ "$IS_WIN" = "1" ]; then # 用 PowerShell 的 Get-NetTCPConnection→Stop-Process,比 netstat+taskkill 可靠 powershell.exe -NoProfile -Command \ "Get-NetTCPConnection -LocalPort $p -State Listen -ErrorAction SilentlyContinue | Select-Object -Expand OwningProcess -Unique | ForEach-Object { try { Stop-Process -Id \$_ -Force -ErrorAction Stop; 'killed pid '+\$_+' on :$p' } catch {} }" \ 2>/dev/null | tr -d '\r' else lsof -ti "tcp:$p" 2>/dev/null | xargs -r kill -9 2>/dev/null && echo " killed listener on :$p" fi } for port in 8770 8771 3001; do kill_port "$port" done echo "✅ 已停止(用户侧 8770 / 后台 8771 / 前端 3001)。"