Fix false array-start failure for start_webhook_listener.sh

No 'already running' guard existed — a relaunch (array stop/start that
doesn't kill the old node process) would exec straight into node, hit
EADDRINUSE on the port, and exit 1 within ~1s. array_started.sh correctly
reported that as a failure, even though the prior listener instance was
still healthy and serving webhooks the whole time. Confirmed live: the
node process from 2026-06-23 (PID 25977) is still running today, and the
2026-07-03 array start logged this exact false failure.

Added acquire_lock "continuous" before the exec — an existing, documented
common.sh mode (skip gracefully if a healthy instance is running) that
wasn't actually used anywhere in the codebase yet.
This commit is contained in:
Gmer4Lfe
2026-07-11 17:55:51 -04:00
parent 1574db3eab
commit c3562c2d0b
+19 -2
View File
@@ -27,8 +27,9 @@
# ============================================================================================== # ==============================================================================================
# #
# 1. Check WEBHOOK_PORT — exit cleanly if 0 (listener disabled) # 1. Check WEBHOOK_PORT — exit cleanly if 0 (listener disabled)
# 2. Check WEBHOOK_SECRET — generate and persist one if empty # 2. acquire_lock "continuous" — exit cleanly if a healthy instance is already running
# 3. exec node webhook_listener.js — replaces this process; PID stays the same # 3. Check WEBHOOK_SECRET — generate and persist one if empty
# 4. exec node webhook_listener.js — replaces this process; PID stays the same
# #
# exec is intentional: array_started.sh tracks the PID of this script to check # exec is intentional: array_started.sh tracks the PID of this script to check
# whether the listener is running. exec preserves that PID across the hand-off # whether the listener is running. exec preserves that PID across the hand-off
@@ -53,11 +54,22 @@
# PID of this script to check liveness — exec ensures that PID continues to # PID of this script to check liveness — exec ensures that PID continues to
# refer to the running node process after the hand-off. # refer to the running node process after the hand-off.
# #
# Continuous-Mode Lock, Not Just PID Tracking
# array_started.sh only checks whether ITS launch attempt is still alive after
# 1s — it has no idea a previous instance might already be listening (e.g. an
# array stop/start that didn't kill the old node process). Without its own
# guard, a relaunch would exec straight into node, hit EADDRINUSE on the port,
# exit 1 almost immediately, and array_started.sh would log a false failure
# for a listener that was actually still healthy. acquire_lock "continuous"
# detects the live instance and exits 0 instead.
#
# ============================================================================================== # ==============================================================================================
# OPERATIONAL SAFEGUARDS # OPERATIONAL SAFEGUARDS
# ============================================================================================== # ==============================================================================================
# #
# WEBHOOK_PORT=0 gate — exits cleanly before any setup if the listener is disabled # WEBHOOK_PORT=0 gate — exits cleanly before any setup if the listener is disabled
# acquire_lock "continuous" — exits 0 cleanly if a healthy instance is already running,
# instead of relaunching into a port conflict
# Secret auto-generate — WEBHOOK_SECRET generated via openssl rand if empty; # Secret auto-generate — WEBHOOK_SECRET generated via openssl rand if empty;
# persisted to master.conf immediately so restarts reuse it # persisted to master.conf immediately so restarts reuse it
# Shared secret gate — webhook URL must include ?key=<WEBHOOK_SECRET>; # Shared secret gate — webhook URL must include ?key=<WEBHOOK_SECRET>;
@@ -97,6 +109,11 @@ source "$ECOSYSTEM_ROOT/load_config.sh"
exit 0 exit 0
} }
# Skip gracefully if a healthy instance is already listening — otherwise a
# restart that doesn't kill the old node process (array stop/start without a
# full reboot) hits EADDRINUSE and array_started.sh logs a false failure.
acquire_lock "continuous"
# ── Auto-generate secret if not yet set ───────────────────────────────────── # ── Auto-generate secret if not yet set ─────────────────────────────────────
if [[ -z "${WEBHOOK_SECRET:-}" ]]; then if [[ -z "${WEBHOOK_SECRET:-}" ]]; then
GENERATED=$(openssl rand -hex 32) GENERATED=$(openssl rand -hex 32)