#!/usr/bin/env bash set -uo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" PORT="${WEB_UI_PORT:-8765}" LOG_FILE="$ROOT_DIR/work/web_ui.log" SERVER_PID_FILE="$ROOT_DIR/work/web_ui.pid" WATCHDOG_PID_FILE="$ROOT_DIR/work/web_ui_watchdog.pid" mkdir -p "$ROOT_DIR/work" echo $$ > "$WATCHDOG_PID_FILE" cd "$ROOT_DIR" start_server() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] [watchdog] starting web_ui.py" >> "$LOG_FILE" python3 -u scripts/web_ui.py >> "$LOG_FILE" 2>&1 & echo "$!" > "$SERVER_PID_FILE" } stop_server() { if [[ -f "$SERVER_PID_FILE" ]]; then local pid pid="$(cat "$SERVER_PID_FILE" 2>/dev/null || true)" if [[ -n "$pid" ]] && kill -0 "$pid" 2>/dev/null; then kill "$pid" 2>/dev/null || true fi fi } trap 'stop_server; rm -f "$WATCHDOG_PID_FILE"; exit 0' INT TERM EXIT while true; do if ! curl -fsS --max-time 2 "http://127.0.0.1:$PORT/" >/dev/null 2>&1; then pids="$(lsof -tiTCP:"$PORT" -sTCP:LISTEN 2>/dev/null || true)" if [[ -n "$pids" ]]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] [watchdog] clearing stale listener: $pids" >> "$LOG_FILE" kill $pids 2>/dev/null || true sleep 1 fi start_server || true sleep 2 fi sleep 5 done