| #!/usr/bin/env bash
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| set -euo pipefail
|
|
|
| PORT="${PORT:-8189}"
|
| TIMEOUT="${TIMEOUT:-120}"
|
| LISTEN="${LISTEN:-127.0.0.1}"
|
| LAUNCH_ID="${LAUNCH_ID:-default}"
|
|
|
| log() { echo "[start_comfyui] $*"; }
|
| err() { echo "[start_comfyui] ERROR: $*" >&2; }
|
| die() { err "$@"; exit 1; }
|
|
|
| [[ -n "${E2E_COMFYUI_ROOT:-}" ]] || die "E2E_COMFYUI_ROOT is not set"
|
| [[ -d "$E2E_COMFYUI_ROOT/comfyui" ]] || die "ComfyUI not found at $E2E_COMFYUI_ROOT/comfyui"
|
| [[ -x "$E2E_COMFYUI_ROOT/venv/bin/python" ]] || die "venv python not found"
|
| [[ -f "$E2E_COMFYUI_ROOT/.e2e_setup_complete" ]] || die "Setup marker not found. Run setup_e2e_env.sh first."
|
|
|
| PY="$E2E_COMFYUI_ROOT/venv/bin/python"
|
| COMFY_DIR="$E2E_COMFYUI_ROOT/comfyui"
|
| LOG_DIR="$E2E_COMFYUI_ROOT/logs"
|
| LOG_FILE="$LOG_DIR/comfyui.${PORT}.${LAUNCH_ID}.log"
|
|
|
|
|
| PID_FILE="$LOG_DIR/comfyui.${PORT}.pid"
|
|
|
| mkdir -p "$LOG_DIR"
|
|
|
|
|
| if ss -tlnp 2>/dev/null | grep -q ":${PORT}\b"; then
|
| log "Port $PORT is in use. Attempting to stop existing process..."
|
| if [[ -f "$PID_FILE" ]]; then
|
| OLD_PID="$(cat "$PID_FILE")"
|
| if kill -0 "$OLD_PID" 2>/dev/null; then
|
| kill "$OLD_PID" 2>/dev/null || true
|
| sleep 2
|
| fi
|
| fi
|
| if ss -tlnp 2>/dev/null | grep -q ":${PORT}\b"; then
|
| pkill -f "main\\.py.*--port $PORT" 2>/dev/null || true
|
| sleep 2
|
| fi
|
| if ss -tlnp 2>/dev/null | grep -q ":${PORT}\b"; then
|
| die "Port $PORT is still in use after cleanup attempt"
|
| fi
|
| log "Port $PORT cleared."
|
| fi
|
|
|
|
|
| log "Starting ComfyUI on port $PORT (listen=$LISTEN, launch_id=$LAUNCH_ID)..."
|
| : > "$LOG_FILE"
|
|
|
| PYTHONUNBUFFERED=1 \
|
| HOME="$E2E_COMFYUI_ROOT/home" \
|
| nohup "$PY" -u "$COMFY_DIR/main.py" \
|
| --cpu \
|
| --port "$PORT" \
|
| --listen "$LISTEN" \
|
| > "$LOG_FILE" 2>&1 &
|
| COMFYUI_PID=$!
|
|
|
| echo "$COMFYUI_PID" > "$PID_FILE"
|
| log "ComfyUI PID=$COMFYUI_PID, log=$LOG_FILE"
|
|
|
|
|
| log "Waiting up to ${TIMEOUT}s for ComfyUI readiness (GET /system_stats)..."
|
| DEADLINE=$(( $(date +%s) + TIMEOUT ))
|
| READY=0
|
| while [[ "$(date +%s)" -lt "$DEADLINE" ]]; do
|
| if curl -sf --max-time 2 "http://127.0.0.1:${PORT}/system_stats" >/dev/null 2>&1; then
|
| READY=1
|
| break
|
| fi
|
|
|
|
|
| if ! kill -0 "$COMFYUI_PID" 2>/dev/null; then
|
| if wait "$COMFYUI_PID" 2>/dev/null; then
|
| :
|
| else
|
| RC=$?
|
| err "ComfyUI exited with code $RC. Last 30 lines of log:"
|
| tail -n 30 "$LOG_FILE" >&2
|
| rm -f "$PID_FILE"
|
| exit 1
|
| fi
|
| fi
|
| sleep 1
|
| done
|
|
|
| if [[ "$READY" -ne 1 ]]; then
|
| err "Timeout (${TIMEOUT}s) waiting for ComfyUI. Last 30 lines of log:"
|
| tail -n 30 "$LOG_FILE" >&2
|
| kill "$COMFYUI_PID" 2>/dev/null || true
|
| rm -f "$PID_FILE"
|
| exit 1
|
| fi
|
|
|
|
|
|
|
|
|
|
|
| LISTENER_PID="$(ss -tlnp 2>/dev/null | grep ":${PORT}\b" | grep -oE 'pid=[0-9]+' | head -n1 | cut -d= -f2)"
|
| if [[ -n "$LISTENER_PID" && "$LISTENER_PID" != "$COMFYUI_PID" ]]; then
|
| log "Listener PID $LISTENER_PID differs from launched PID $COMFYUI_PID (restart). Updating PID file."
|
| COMFYUI_PID="$LISTENER_PID"
|
| echo "$COMFYUI_PID" > "$PID_FILE"
|
| fi
|
|
|
| log "ComfyUI is ready."
|
| echo "COMFYUI_PID=$COMFYUI_PID PORT=$PORT LOG_FILE=$LOG_FILE"
|
|
|