Script zum start der beiden Bots

Zuletzt geändert von René Schmidt am 2025/10/28 20:41

./venv/bin/python Umgebung wird genutzt

cat > ~/bots.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")"

# Projekte (liegen direkt unter ~)
JEAN_DIR="jean-matrix-bot-complete"
TERR_DIR="terry_bot_github"

# Optional: Env-Vars je Bot (falls JEAN z.B. Matrix-Login braucht)
JEAN_ENV=''   # z.B.: 'export MATRIX_HOMESERVER=https://... MATRIX_USER=@...:... MATRIX_PASSWORD=...'
TERR_ENV=''

LOG_DIR="logs"; PID_DIR="pids"
mkdir -p "$LOG_DIR" "$PID_DIR"
JEAN_LOG="$LOG_DIR/jean.log";  TERRY_LOG="$LOG_DIR/terry.log"
JEAN_PID="$PID_DIR/jean.pid";  TERRY_PID="$PID_DIR/terry.pid"

is_running(){ [[ -f "$1" ]] && kill -0 "$(cat "$1" 2>/dev/null)" 2>/dev/null; }

require_py(){
  local proj="$1"
  local py="$proj/venv/bin/python"
  if [[ ! -x "$py" ]]; then
    echo "FEHLER: $py fehlt oder ist nicht ausführbar."
    echo "Fix: venv (neu) bauen:"
    echo "  cd '$proj' && rm -rf venv && python3 -m venv venv && source venv/bin/activate && pip install -r requirements.txt"
    return 1
  fi
}

start_one(){
  local name="$1" proj="$2" log="$3" pid="$4" envvars="$5" entry="$6"
  if is_running "$pid"; then echo "$name läuft bereits (PID $(cat "$pid"))."; return 0; fi
  require_py "$proj" || { echo "$name Start abgebrochen."; return 1; }
  {
    echo "===== $name START $(date) ====="
    echo "+ run:  cd '$proj' && $envvars exec ./venv/bin/python $entry"
    echo "+ py:   $("$proj/venv/bin/python" -V 2>&1 || true)"
  } >>"$log"
  nohup bash -lc "cd '$proj' && $envvars exec ./venv/bin/python $entry" >>"$log" 2>&1 & echo $! >"$pid"
  sleep 0.8
  if is_running "$pid"; then
    echo "Gestartet: $name (PID $(cat "$pid")) → Log: $log"
  else
    echo "FEHLER: $name konnte nicht gestartet werden. Letzte Log-Zeilen:" >&2
    tail -n 60 "$log" >&2 || true
    rm -f "$pid"
    return 1
  fi
}

stop_one(){
  local name="$1" pid="$2"
  if ! is_running "$pid"; then echo "$name ist nicht aktiv."; rm -f "$pid"; return 0; fi
  local p; p="$(cat "$pid")"; echo -n "Stoppe $name (PID $p)… "
  kill "$p" 2>/dev/null || true
  for _ in {1..20}; do kill -0 "$p" 2>/dev/null || { echo "ok"; rm -f "$pid"; return 0; }; sleep 0.5; done
  echo "kill -9"; kill -9 "$p" 2>/dev/null || true; rm -f "$pid"
}

case "${1:-}" in
  start)
    err=0
    start_one "JEAN"  "$JEAN_DIR"  "$JEAN_LOG"  "$JEAN_PID"  "$JEAN_ENV" "-m jean.core.bot" || err=1
    start_one "TERRY" "$TERR_DIR" "$TERRY_LOG" "$TERRY_PID" "$TERR_ENV" "bot.py"            || err=1
    exit $err
    ;;
  stop)
    stop_one "JEAN" "$JEAN_PID"
    stop_one "TERRY" "$TERRY_PID"
    ;;
  restart)
    "$0" stop || true
    "$0" start
    ;;
  status)
    if is_running "$JEAN_PID"; then echo "✓ JEAN läuft (PID $(cat "$JEAN_PID")) — $JEAN_LOG"; else echo "✗ JEAN läuft nicht"; fi
    if is_running "$TERRY_PID"; then echo "✓ TERRY läuft (PID $(cat "$TERRY_PID")) — $TERRY_LOG"; else echo "✗ TERRY läuft nicht"; fi
    ;;
  logs)
    touch "$JEAN_LOG" "$TERRY_LOG"
    tail -f "$JEAN_LOG" "$TERRY_LOG"
    ;;
  *)
    echo "Verwendung: $0 {start|stop|restart|status|logs}"; exit 1;;
esac
EOF

Alte Logs/PIDs löschen, Syntax prüfen, starten:

rm -f ~/logs/*.log ~/pids/*.pid 2>/dev/null || true
sed -i 's/\r$//' ~/bots.sh
bash -n ~/bots.sh
chmod +x ~/bots.sh

# Start & Status ansehen
bash ~/bots.sh restart
bash ~/bots.sh status
bash ~/bots.sh logs

bash ~/bots.sh restart
bash ~/bots.sh status
bash ~/bots.sh logs