#!/bin/bash # ================================================================ # Verwaltet die lokale Web-Testinstanz (FastAPI/uvicorn, M1) # # run_web.sh start - startet den Server im Hintergrund # run_web.sh stop - beendet den Server (inkl. Reload-Kindprozesse) # run_web.sh status - zeigt ob und unter welcher PID er laeuft # run_web.sh - startet im Vordergrund (Strg+C zum Beenden) # # http://localhost:8000 Testoberflaeche # http://localhost:8000/docs interaktive API-Doku (Swagger) # ================================================================ source "$(dirname "${BASH_SOURCE[0]}")/setenv.sh" > /dev/null WEB_PORT=8000 PIDDATEI="$PLATZ/log/run_web.pid" LOGDATEI="$PLATZ/log/run_web.log" venv_pruefen() { if [ -f "$PLATZ/.venv/bin/activate" ]; then source "$PLATZ/.venv/bin/activate" else echo "FEHLER: kein .venv gefunden - bitte zuerst bin/install_py.sh ausfuehren" return 1 fi } lauft_pid() { # gibt die PID des Servers aus, wenn er laeuft (Rueckgabe 0), sonst 1 if [ -f "$PIDDATEI" ]; then local pid pid=$(cat "$PIDDATEI") if kill -0 "$pid" 2> /dev/null; then echo "$pid" return 0 fi rm -f "$PIDDATEI" fi # Fallback: nach dem Prozess suchen (z.B. PID-Datei verloren) pgrep -f "uvicorn main:app.*--port $WEB_PORT" | head -1 && return 0 return 1 } case "${1:-}" in start) venv_pruefen || exit 1 if pid=$(lauft_pid); then echo "Server laeuft bereits (PID $pid) - erst 'run_web.sh stop'." exit 1 fi mkdir -p "$PLATZ/log" echo "Starte Web-Testinstanz im Hintergrund ..." nohup python -m uvicorn main:app --reload \ --app-dir "$PLATZ/web" --port "$WEB_PORT" \ > "$LOGDATEI" 2>&1 & echo $! > "$PIDDATEI" sleep 3 if pid=$(lauft_pid); then echo "Server laeuft: http://localhost:$WEB_PORT (PID $pid, Log: log/run_web.log)" else echo "FEHLER: Server ist nicht gestartet - siehe $LOGDATEI" exit 1 fi ;; stop) gestoppt=0 if pid=$(lauft_pid); then # ganze Prozessgruppe beenden (uvicorn-Reloader + Kindprozesse) pkill -TERM -P "$pid" 2> /dev/null && gestoppt=1 kill "$pid" 2> /dev/null && gestoppt=1 fi # Nachzuegler, deren Elternprozess schon weg ist pkill -f "uvicorn main:app.*--port $WEB_PORT" 2> /dev/null && gestoppt=1 rm -f "$PIDDATEI" if [ "$gestoppt" = "1" ]; then echo "Beendet."; else echo "Es lief nichts."; fi ;; status) if pid=$(lauft_pid); then echo "LAEUFT: http://localhost:$WEB_PORT (PID $pid)" else echo "GESTOPPT: kein Server auf Port $WEB_PORT" fi ;; "") venv_pruefen || exit 1 echo "Starte Web-Testinstanz im Vordergrund (Strg+C zum Beenden) ..." exec python -m uvicorn main:app --reload \ --app-dir "$PLATZ/web" --port "$WEB_PORT" ;; *) echo "Unbekannter Parameter '$1' - erlaubt: start | stop | status" exit 1 ;; esac