#!/bin/bash # Arranca la API de SINADEF si no está corriendo. Idempotente: se puede invocar # desde @reboot y desde un watchdog periódico sin levantar procesos duplicados. set -u DIR="/home/osalas/apps/sinadef" PY="/home/osalas/anaconda3/bin" PORT=8009 LOG="$DIR/api.log" # ¿Ya hay alguien escuchando en el puerto? if ss -ltn "sport = :$PORT" 2>/dev/null | grep -q ":$PORT"; then exit 0 fi cd "$DIR" || exit 1 echo "=== $(date '+%F %T') levantando API en :$PORT ===" >> "$LOG" # setsid la desacopla de la sesión que la lanza, para que sobreviva al logout. # # Un solo worker a propósito: la cola de proyecciones guarda el estado de cada # trabajo en memoria del proceso. Con varios workers, el polling de progreso cae # en un worker distinto al que corre el trabajo y responde 404 de forma # intermitente. La concurrencia de lectura la resuelve el threadpool de FastAPI # junto con los cursores de DuckDB, no más procesos. setsid nohup "$PY/uvicorn" main:app \ --host 0.0.0.0 --port "$PORT" --workers 1 \ >> "$LOG" 2>&1 < /dev/null & disown 2>/dev/null || true