From b99a9fe7d475d18ca8da9f53d479bc3de2a308f5 Mon Sep 17 00:00:00 2001 From: hitonabi Date: Tue, 14 Jul 2026 03:55:48 +0200 Subject: [PATCH] =?UTF-8?q?feature/mc2-restart-sigterm:=20systemd-Override?= =?UTF-8?q?=20f=C3=BCr=20automatischen=20Neustart=20bei=20stop-sigterm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Override-Datei mit Restart=always, TimeoutStopSec=10, RestartSec=5 - README mit Installations- und Diagnoseanleitung - Ziel: MC2 läuft auch nach SIGTERM-Timeout weiter --- deploy/mission-control-2.service.d/README.md | 137 ++++++++++++++++++ .../mission-control-2.service.d/override.conf | 22 +++ 2 files changed, 159 insertions(+) create mode 100644 deploy/mission-control-2.service.d/README.md create mode 100644 deploy/mission-control-2.service.d/override.conf diff --git a/deploy/mission-control-2.service.d/README.md b/deploy/mission-control-2.service.d/README.md new file mode 100644 index 0000000..c34996e --- /dev/null +++ b/deploy/mission-control-2.service.d/README.md @@ -0,0 +1,137 @@ +# systemd-Override für mission-control-2.service + +## Zweck + +Diese Override-Datei sorgt dafür, dass `mission-control-2.service` **automatisch neu startet**, selbst wenn der Dienst durch `stop-sigterm` (normales Stoppen mit SIGTERM) beendet wird. + +Ohne diesen Override: +- `Restart=on-failure` startet nur bei non-zero Exit-Codes neu. +- Bei `stop-sigterm`-Timeout (Prozess beendet sich nicht innerhalb von `TimeoutStopSec`) bleibt der Dienst tot. + +Mit diesem Override: +- `Restart=always` startet nach **jeder** Beendigung (SIGTERM, SIGKILL, Crash, etc.) neu. +- `TimeoutStopSec=10` gibt dem Prozess 10 Sekunden für sauberes Herunterfahren, dann wird SIGKILL gesendet. +- `RestartSec=5` verhindert Flackern durch kurze Pause vor dem Neustart. + +## Installation + +```bash +# Override-Verzeichnis erstellen +mkdir -p ~/.config/systemd/user/mission-control-2.service.d/ + +# Datei kopieren +cp ~/mission-control-v2/deploy/mission-control-2.service.d/override.conf ~/.config/systemd/user/mission-control-2.service.d/ + +# Systemd neu laden +systemctl --user daemon-reload + +# Dienst neu starten (Override wird jetzt aktiv) +systemctl --user restart mission-control-2 + +# Status prüfen +systemctl --user status mission-control-2 +``` + +## Diagnose + +### Überprüfen, ob Override aktiv ist + +```bash +systemctl --user cat mission-control-2 | grep -A 10 "\[Service\]" +``` + +Erwartete Ausgabe (Override wird **nach** der Haupt-Unit geladen): + +``` +# /home/hitonabi/.config/systemd/user/mission-control-2.service +[Unit] +Description=Mission Control 2.0 (Cockpit) +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +WorkingDirectory=%h/mission-control-v2/backend +ExecStart=%h/mission-control-v2/backend/.venv/bin/python -m uvicorn app:app --host 0.0.0.0 --port 9001 +Environment=PYTHONPATH=%h/mission-control-v2 +Environment=MC_PORT=9001 +Environment=MC_LLAMA_SWAP_URL=http://127.0.0.1:8080 +Environment=MC_CONFIG_PATH=/etc/llama-swap/config.yaml +Environment=MC_MODELS_DIR=/srv/models +Environment=MC_MEMORY_DB=/srv/models/mission-control-memory.db +Restart=on-failure +RestartSec=3 + +# /home/hitonabi/.config/systemd/user/mission-control-2.service.d/override.conf +[Service] +Restart=always +TimeoutStopSec=10 +RestartSec=5 +``` + +### Testen des Restart-Verhaltens + +**Vorsicht**: Der Dienst wird neu gestartet. + +```bash +# SIGTERM senden (sollte sofort neu starten) +systemctl --user kill mission-control-2 -s SIGTERM + +# Status prüfen (sollte „active (running)“ zeigen) +systemctl --user status mission-control-2 --wait +``` + +### Log-Ausgabe nach Restart + +```bash +# Letzte Logs anzeigen (auch nach Restart) +journalctl --user -u mission-control-2 -f +``` + +## Fehlerbehandlung + +### Dienst startet nicht mehr nach Override + +1. Override temporär deaktivieren: + ```bash + mv ~/.config/systemd/user/mission-control-2.service.d/override.conf{,.bak} + systemctl --user daemon-reload + systemctl --user restart mission-control-2 + ``` + +2. Log prüfen: + ```bash + journalctl --user -u mission-control-2 -n 100 --no-pager + ``` + +3. Wenn `Restart=always` zu häufigem Neustart führt: + - `RestartSec` erhöhen (z. B. auf 30) + - `StartLimitIntervalSec` und `StartLimitBurst` setzen (z. B. `StartLimitIntervalSec=60`, `StartLimitBurst=3`) + +### Diagnose-Skript + +```bash +#!/bin/bash +# Diagnose-Script für mission-control-2 Restart-Verhalten + +echo "=== mission-control-2 Restart-Konfiguration ===" + +echo "Aktueller Restart-Modus:" +systemctl --user show mission-control-2 | grep -E "^Restart=|^RestartSec=|^TimeoutStopSec=" + +echo "" +echo "Override-Datei existiert?" +if [[ -f ~/.config/systemd/user/mission-control-2.service.d/override.conf ]]; then + echo "Ja" + echo "Override-Inhalt:" + cat ~/.config/systemd/user/mission-control-2.service.d/override.conf +else + echo "Nein" +fi +``` + +## Hinweise + +- Diese Override-Datei ersetzt die `Restart=on-failure`-Einstellung in der Haupt-Unit. +- Die Override-Datei ist **nicht** Bestandteil des Live-Checkouts `~/mission-control-v2`. +- Nach jedem `deploy.sh`-Lauf muss der Override manuell wiederhergestellt werden, da `deploy.sh` den Live-Checkout resettet. diff --git a/deploy/mission-control-2.service.d/override.conf b/deploy/mission-control-2.service.d/override.conf new file mode 100644 index 0000000..5dbd86b --- /dev/null +++ b/deploy/mission-control-2.service.d/override.conf @@ -0,0 +1,22 @@ +# systemd-Override für mission-control-2.service +# Ziel: Automatischer Neustart auch bei stop-sigterm Timeout +# +# Verwendung: +# 1. Kopieren nach ~/.config/systemd/user/mission-control-2.service.d/override.conf +# 2. systemctl --user daemon-reload +# 3. systemctl --user restart mission-control-2 +# +# Verhaltensänderungen: +# - Restart=always → startet nach BEENDUNG (auch SIGTERM) automatisch neu +# - TimeoutStopSec=10 → gibt dem Prozess 10s für sauberes Stoppen, dann SIGKILL +# - RestartSec=5 → kurze Pause vor Neustart (verhindert Flackern bei sofortigem Crash) + +[Service] +# Startet nach jedem Beendigung (auch SIGTERM, SIGSEGV, etc.) neu +Restart=always + +# Zeitlimit für SIGTERM-Phase vor SIGKILL +TimeoutStopSec=10 + +# Wartezeit zwischen Beendigung und Neustart +RestartSec=5