| #!/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" |
|
|