fix: clean stale deployments before monolith start
This commit is contained in:
@@ -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")"
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user