fix: clean stale deployments before monolith start

This commit is contained in:
Deploy
2026-08-25 21:59:29 +02:00
parent 9ae5f8e0de
commit 66a08b61d2
4 changed files with 89 additions and 22 deletions

View File

@@ -130,6 +130,69 @@ port_pid() {
fi
}
port_pids() {
local port="$1"
if command -v lsof >/dev/null 2>&1; then
lsof -nP -tiTCP:"$port" -sTCP:LISTEN 2>/dev/null | sort -u || true
fi
}
stop_pid() {
local pid="$1" label="$2" deadline
[[ -n "$pid" ]] || return 0
if ! kill -0 "$pid" 2>/dev/null; then
return 0
fi
echo "[INFO] Stopping $label (PID $pid)..."
kill -TERM "$pid" 2>/dev/null || true
deadline=$((SECONDS + 15))
while kill -0 "$pid" 2>/dev/null && (( SECONDS < deadline )); do sleep 1; done
if kill -0 "$pid" 2>/dev/null; then
echo "[WARN] $label did not stop gracefully; sending KILL"
kill -KILL "$pid" 2>/dev/null || true
fi
}
stop_service_port_listeners() {
local service="$1" port pid found=0
port="$(service_port "$service")"
while IFS= read -r pid; do
[[ -n "$pid" ]] || continue
found=1
stop_pid "$pid" "stale $service listener on port $port"
done < <(port_pids "$port")
if [[ "$found" == 1 ]]; then
rm -f "$(pid_file "$service")"
fi
}
stop_stale_project_processes() {
local pid cmd
while IFS= read -r line; do
pid="${line%% *}"
cmd="${line#* }"
[[ -n "$pid" && "$pid" =~ ^[0-9]+$ ]] || continue
[[ "$pid" == "$$" || "$pid" == "$BASHPID" ]] && continue
case "$cmd" in
*"$PROJECT_DIR"*"tsx"*"watch src/infrastructure/http/server.ts"*|\
*"$PROJECT_DIR"*"node_modules/tsx/dist/cli.mjs watch src/infrastructure/http/server.ts"*|\
*"$PROJECT_DIR"*"next start"*|\
*"$PROJECT_DIR"*"node_modules/next/dist/bin/next start"*)
stop_pid "$pid" "stale project process"
;;
esac
done < <(ps -axo pid=,command= 2>/dev/null | sed 's/^ *//')
}
clear_stale_deployments() {
echo '[INFO] Clearing old service deployments from managed ports...'
stop_stale_project_processes
local service
for service in "${SERVICES[@]}"; do
stop_service_port_listeners "$service"
done
}
assert_port_available() {
local service="$1" port existing managed
port="$(service_port "$service")"
@@ -301,11 +364,8 @@ spawn_service() {
start_all() {
ensure_env
clear_stale_deployments
for service in "${SERVICES[@]}"; do
if is_running "$service"; then
echo "[FAIL] $service is already managed in $MODE mode; use restart" >&2
exit 1
fi
rm -f "$(pid_file "$service")"
assert_port_available "$service"
done
@@ -320,24 +380,9 @@ start_all() {
}
stop_service() {
local service="$1" pid deadline
local service="$1" pid
pid="$(read_pid "$service")"
if [[ -z "$pid" ]]; then
rm -f "$(pid_file "$service")"
return
fi
if ! kill -0 "$pid" 2>/dev/null; then
rm -f "$(pid_file "$service")"
return
fi
echo "[INFO] Stopping $service (PID $pid)..."
kill -TERM "$pid" 2>/dev/null || true
deadline=$((SECONDS + 15))
while kill -0 "$pid" 2>/dev/null && (( SECONDS < deadline )); do sleep 1; done
if kill -0 "$pid" 2>/dev/null; then
echo "[WARN] $service did not stop gracefully; sending KILL"
kill -KILL "$pid" 2>/dev/null || true
fi
stop_pid "$pid" "$service"
rm -f "$(pid_file "$service")"
}