#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" # shellcheck source=scripts/local-debug/env.sh source "$ROOT_DIR/scripts/local-debug/env.sh" if [[ ! -d "$LOCAL_DEBUG_PID_DIR" ]]; then printf 'no local debug pid directory at %s\n' "$LOCAL_DEBUG_PID_DIR" else for name in platform_web run platform; do pid_file="$LOCAL_DEBUG_PID_DIR/$name.pid" if [[ ! -f "$pid_file" ]]; then continue fi pid="$(cat "$pid_file")" if kill -0 "$pid" 2>/dev/null; then printf 'stopping %s pid %s\n' "$name" "$pid" kill "$pid" 2>/dev/null || true else printf '%s pid %s is not running\n' "$name" "$pid" fi rm -f "$pid_file" done fi wait_for_pid_exit() { local pid="$1" for _ in $(seq 1 20); do if ! kill -0 "$pid" 2>/dev/null; then return 0 fi sleep 0.25 done return 1 } listener_owned_by_local_debug() { local pid="$1" local details details="$(lsof -nP -p "$pid" 2>/dev/null || true)" [[ "$details" == *"$ROOT_DIR"* || "$details" == *"$LOCAL_DEBUG_ROOT"* ]] } stop_listener_on_port() { local name="$1" local port="$2" local pid pid="$(lsof -tiTCP:"$port" -sTCP:LISTEN 2>/dev/null | head -n 1 || true)" if [[ -z "$pid" ]]; then return 0 fi if listener_owned_by_local_debug "$pid"; then printf 'stopping %s listener pid %s on port %s\n' "$name" "$pid" "$port" kill "$pid" 2>/dev/null || true if ! wait_for_pid_exit "$pid"; then printf '%s listener pid %s did not stop after SIGTERM; sending SIGKILL\n' "$name" "$pid" kill -9 "$pid" 2>/dev/null || true wait_for_pid_exit "$pid" || true fi return 0 else printf '%s port %s is still used by pid %s outside local debug ownership\n' "$name" "$port" "$pid" >&2 fi } stop_listener_on_port platform "$LOCAL_DEBUG_PLATFORM_PORT" stop_listener_on_port platform_web "$LOCAL_DEBUG_WEB_PORT"