Last modified by René Schmidt on 2025/10/28 20:41

Hide last authors
René Schmidt 1.1 1 ./venv/bin/python Umgebung wird genutzt
2
3
4
5
6 cat > ~~/bots.sh <<'EOF'
7 #!/usr/bin/env bash
8 set -euo pipefail
9 cd "$(dirname "$0")"
10
11 # Projekte (liegen direkt unter ~~)
12 JEAN_DIR="jean-matrix-bot-complete"
13 TERR_DIR="terry_bot_github"
14
15 # Optional: Env-Vars je Bot (falls JEAN z.B. Matrix-Login braucht)
16 JEAN_ENV=''  # z.B.: 'export MATRIX_HOMESERVER=https:~/~/... MATRIX_USER=@...:... MATRIX_PASSWORD=...'
17 TERR_ENV=''
18
19 LOG_DIR="logs"; PID_DIR="pids"
20 mkdir -p "$LOG_DIR" "$PID_DIR"
21 JEAN_LOG="$LOG_DIR/jean.log";  TERRY_LOG="$LOG_DIR/terry.log"
22 JEAN_PID="$PID_DIR/jean.pid";  TERRY_PID="$PID_DIR/terry.pid"
23
24 is_running(){ ~[~[ -f "$1" ]] && kill -0 "$(cat "$1" 2>/dev/null)" 2>/dev/null; }
25
26 require_py(){
27 local proj="$1"
28 local py="$proj/venv/bin/python"
29 if ~[~[ ! -x "$py" ]]; then
30 echo "FEHLER: $py fehlt oder ist nicht ausführbar."
31 echo "Fix: venv (neu) bauen:"
32 echo "  cd '$proj' && rm -rf venv && python3 -m venv venv && source venv/bin/activate && pip install -r requirements.txt"
33 return 1
34 fi
35 }
36
37 start_one(){
38 local name="$1" proj="$2" log="$3" pid="$4" envvars="$5" entry="$6"
39 if is_running "$pid"; then echo "$name läuft bereits (PID $(cat "$pid"))."; return 0; fi
40 require_py "$proj" || { echo "$name Start abgebrochen."; return 1; }
41 {
42 echo "===== $name START $(date) ====="
43 echo "+ run:  cd '$proj' && $envvars exec ./venv/bin/python $entry"
44 echo "+ py:  $("$proj/venv/bin/python" -V 2>&1 || true)"
45 } >>"$log"
46 nohup bash -lc "cd '$proj' && $envvars exec ./venv/bin/python $entry" >>"$log" 2>&1 & echo $! >"$pid"
47 sleep 0.8
48 if is_running "$pid"; then
49 echo "Gestartet: $name (PID $(cat "$pid")) → Log: $log"
50 else
51 echo "FEHLER: $name konnte nicht gestartet werden. Letzte Log-Zeilen:" >&2
52 tail -n 60 "$log" >&2 || true
53 rm -f "$pid"
54 return 1
55 fi
56 }
57
58 stop_one(){
59 local name="$1" pid="$2"
60 if ! is_running "$pid"; then echo "$name ist nicht aktiv."; rm -f "$pid"; return 0; fi
61 local p; p="$(cat "$pid")"; echo -n "Stoppe $name (PID $p)… "
62 kill "$p" 2>/dev/null || true
63 for _ in {1..20}; do kill -0 "$p" 2>/dev/null || { echo "ok"; rm -f "$pid"; return 0; }; sleep 0.5; done
64 echo "kill -9"; kill -9 "$p" 2>/dev/null || true; rm -f "$pid"
65 }
66
67 case "${1:-}" in
68 start)
69 err=0
70 start_one "JEAN"  "$JEAN_DIR"  "$JEAN_LOG"  "$JEAN_PID"  "$JEAN_ENV" "-m jean.core.bot" || err=1
71 start_one "TERRY" "$TERR_DIR" "$TERRY_LOG" "$TERRY_PID" "$TERR_ENV" "bot.py"  || err=1
72 exit $err
73 ;;
74 stop)
75 stop_one "JEAN" "$JEAN_PID"
76 stop_one "TERRY" "$TERRY_PID"
77 ;;
78 restart)
79 "$0" stop || true
80 "$0" start
81 ;;
82 status)
83 if is_running "$JEAN_PID"; then echo "✓ JEAN läuft (PID $(cat "$JEAN_PID")) — $JEAN_LOG"; else echo "✗ JEAN läuft nicht"; fi
84 if is_running "$TERRY_PID"; then echo "✓ TERRY läuft (PID $(cat "$TERRY_PID")) — $TERRY_LOG"; else echo "✗ TERRY läuft nicht"; fi
85 ;;
86 logs)
87 touch "$JEAN_LOG" "$TERRY_LOG"
88 tail -f "$JEAN_LOG" "$TERRY_LOG"
89 ;;
90 *)
91 echo "Verwendung: $0 {start|stop|restart|status|logs}"; exit 1;;
92 esac
93 EOF
94
95
96
97 __//**Alte Logs/PIDs löschen, Syntax prüfen, starten:**//__
98
99
100 rm -f ~~/logs/*.log ~~/pids/*.pid 2>/dev/null || true
101 sed -i 's/\r$~/~/' ~~/bots.sh
102 bash -n ~~/bots.sh
103 chmod +x ~~/bots.sh
104
105 # Start & Status ansehen
106 bash ~~/bots.sh restart
107 bash ~~/bots.sh status
108 bash ~~/bots.sh logs
109
110
111 bash ~~/bots.sh restart
112 bash ~~/bots.sh status
113 bash ~~/bots.sh logs
114
115
116
117