Files
browser/scripts/local-debug/stop.sh
T

70 lines
1.9 KiB
Bash
Executable File

#!/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"