[object Object]

← back to Small Business Builder

fix(ops): port hawk to sf-style pm2-jlist pattern — old curl-only hawk had wrong /opt/homebrew/bin/pm2 path so it logged 'No such file' every fire and silently failed

5aaf4a3795e9968459d206020fff6ba98d5751f7 · 2026-05-06 12:50:30 -0700 · SteveStudio2

Files touched

Diff

commit 5aaf4a3795e9968459d206020fff6ba98d5751f7
Author: SteveStudio2 <steve@designerwallcoverings.com>
Date:   Wed May 6 12:50:30 2026 -0700

    fix(ops): port hawk to sf-style pm2-jlist pattern — old curl-only hawk had wrong /opt/homebrew/bin/pm2 path so it logged 'No such file' every fire and silently failed
---
 scripts/hawk-local.sh | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/scripts/hawk-local.sh b/scripts/hawk-local.sh
new file mode 100755
index 0000000..5453c5c
--- /dev/null
+++ b/scripts/hawk-local.sh
@@ -0,0 +1,42 @@
+#!/usr/bin/env bash
+# Local PM2 watchdog for smb-builder. Fires every 5 min via launchd.
+# Modeled on site-factory/scripts/hawk-local.sh and ventura-corridor/scripts/hawk-local.sh.
+#
+# Daemon dead → pm2 resurrect. smb-builder not online → pm2 restart.
+# Old hawk used `curl /healthz || pm2 restart` with /opt/homebrew/bin/pm2 (doesn't
+# exist on this Mac) so it logged "No such file" and silently failed every fire.
+
+set -uo pipefail
+export PATH="/Users/stevestudio2/.npm-global/bin:/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin"
+
+PM2=/Users/stevestudio2/.npm-global/bin/pm2
+LOG=/Users/stevestudio2/Projects/small-business-builder/logs/hawk.log
+TS() { date -u +%FT%TZ; }
+mkdir -p "$(dirname "$LOG")"
+
+if ! JLIST=$("$PM2" jlist 2>/dev/null); then
+  echo "[$(TS)] DAEMON DOWN — running pm2 resurrect" >> "$LOG"
+  "$PM2" resurrect >> "$LOG" 2>&1
+  exit 0
+fi
+
+STATUS=$(printf '%s' "$JLIST" \
+  | /usr/bin/python3 -c '
+import json, sys
+try:
+    procs = json.load(sys.stdin)
+except Exception:
+    sys.exit(0)
+for p in procs:
+    if p.get("name") == "smb-builder":
+        print(p.get("pm2_env", {}).get("status", "missing"))
+        sys.exit(0)
+print("missing")
+')
+
+if [ "$STATUS" = "online" ]; then
+  echo "[$(TS)] OK — smb-builder online" >> "$LOG"
+else
+  echo "[$(TS)] smb-builder status=$STATUS — restarting" >> "$LOG"
+  "$PM2" restart smb-builder >> "$LOG" 2>&1
+fi

← c6fa785 deploy: ship smb-builder to Kamatera + capture full schema i  ·  back to Small Business Builder  ·  tighten .gitignore: add missing standing-rule patterns (dist a3c524f →