diff --git a/stop-frontend.sh b/stop-frontend.sh index 5ef7996..21721fc 100755 --- a/stop-frontend.sh +++ b/stop-frontend.sh @@ -22,8 +22,12 @@ _stop_fe() { if [[ -f "$pidfile" ]]; then local pid; pid=$(cat "$pidfile") if kill -0 "$pid" 2>/dev/null; then - # 杀掉整个进程组(覆盖 npm/pnpm/yarn 子进程) - kill -- -"$(ps -o pgid= -p "$pid" 2>/dev/null | tr -d ' ')" 2>/dev/null || kill "$pid" 2>/dev/null || true + # 只杀该前端的进程树,避免同一脚本启动的其它前端共享进程组时被误杀。 + _kill_tree "$pid" TERM + sleep 1 + if kill -0 "$pid" 2>/dev/null; then + _kill_tree "$pid" KILL + fi success "$name 已停止 (PID=$pid)" else warn "$name 进程不存在(可能已退出)" @@ -34,6 +38,16 @@ _stop_fe() { fi } +_kill_tree() { + local pid="$1" signal="${2:-TERM}" + local children child + children=$(pgrep -P "$pid" 2>/dev/null || true) + for child in $children; do + _kill_tree "$child" "$signal" + done + kill "-$signal" "$pid" 2>/dev/null || true +} + if [[ "$TARGET" == "all" ]]; then step "停止全部前端开发服务器" for proj in "${FE_PROJECTS[@]}"; do