Script zum start der beiden Bots
./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