fix: Startaufruf absichern und Neustartschleife der Station deckeln
- 'on' fing bisher nur einen bereits laufenden, aber toten Dienst ab. Scheiterte schon der Aufruf "systemctl start" selbst (z.B. start-limit-hit nach einer Absturzserie durch Restart=always), beendete set -eu das Skript dort, bevor die Lebendigkeitspruefung je erreicht wurde - der eben hochgefahrene Zugangspunkt blieb offen ohne Server dahinter stehen. Der Startaufruf wird jetzt selbst abgefangen und faehrt im Fehlerfall dieselbe Rueckabwicklung wie die is-active-Pruefung. "systemctl reset-failed" vor dem Start verhindert, dass eine fruehere Absturzserie den naechsten ehrlichen Versuch blockiert. - Stirbt der Dienst nach einem erfolgreichen Start, stoppt das Skript ihn jetzt explizit, bevor es den Zugangspunkt herunterfaehrt und "abgeschaltet" meldet - sonst haette ein mit Restart=always weiterlaufender Dienst im Hintergrund einen saubereren Zustand suggeriert, als tatsaechlich vorlag. - ninlight-station.service setzt StartLimitIntervalSec/StartLimitBurst jetzt explizit statt sich stillschweigend auf systemds Vorgabewerte zu verlassen, mit Begruendung als Kommentar: ohne Zugangspunkt kann server.py nicht binden und stirbt sofort, Restart=always soll das nach kurzer Zeit ehrlich aufgeben statt das Journal zu fluten. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
10cc67d490
commit
cb0a4b035d
@@ -38,7 +38,18 @@ on)
|
|||||||
n=$(images | wc -l | tr -d ' ')
|
n=$(images | wc -l | tr -d ' ')
|
||||||
[ "$n" -gt 0 ] || echo "Warnung: $IMAGE_DIR enthaelt kein Image - die Station antwortet auf alles mit 404" >&2
|
[ "$n" -gt 0 ] || echo "Warnung: $IMAGE_DIR enthaelt kein Image - die Station antwortet auf alles mit 404" >&2
|
||||||
sudo nmcli con up "$AP_CONNECTION" >/dev/null
|
sudo nmcli con up "$AP_CONNECTION" >/dev/null
|
||||||
sudo systemctl start ninlight-station
|
# Eine fruehere Absturzserie darf den naechsten ehrlichen Versuch nicht
|
||||||
|
# blockieren (systemd verweigert "start" sonst sofort mit "start-limit-hit").
|
||||||
|
sudo systemctl reset-failed ninlight-station 2>/dev/null || true
|
||||||
|
if ! sudo systemctl start ninlight-station; then
|
||||||
|
# Der Start-Aufruf selbst ist gescheitert (z.B. start-limit-hit) - unter
|
||||||
|
# set -eu wuerde das Skript hier sonst abbrechen, bevor die
|
||||||
|
# Lebendigkeitspruefung unten je erreicht wird, und der eben
|
||||||
|
# hochgefahrene Zugangspunkt bliebe offen ohne Server dahinter stehen.
|
||||||
|
sudo nmcli con down "$AP_CONNECTION" >/dev/null 2>&1 || true
|
||||||
|
echo "Fehler: ninlight-station liess sich nicht starten - Zugangspunkt wieder abgeschaltet. Details: journalctl -u ninlight-station" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
# "systemctl start" meldet bei Type=simple schon Erfolg, sobald der Prozess
|
# "systemctl start" meldet bei Type=simple schon Erfolg, sobald der Prozess
|
||||||
# gestartet wurde - nicht, sobald er ueberlebt hat. Kurz warten und wirklich
|
# gestartet wurde - nicht, sobald er ueberlebt hat. Kurz warten und wirklich
|
||||||
# nachsehen, sonst bleibt ein offener AP ohne Server dahinter stehen.
|
# nachsehen, sonst bleibt ein offener AP ohne Server dahinter stehen.
|
||||||
@@ -47,6 +58,10 @@ on)
|
|||||||
echo "Station an: SSID $SSID auf 192.168.8.1, $n Image(s)"
|
echo "Station an: SSID $SSID auf 192.168.8.1, $n Image(s)"
|
||||||
echo "Nicht vergessen: 'ninlight-station off', wenn du fertig bist."
|
echo "Nicht vergessen: 'ninlight-station off', wenn du fertig bist."
|
||||||
else
|
else
|
||||||
|
# Mit Restart=always laeuft ein abgestuerzter Dienst sonst im Hintergrund
|
||||||
|
# weiter in seiner Neustartschleife - erst stoppen, dann den AP runter,
|
||||||
|
# sonst suggeriert die Meldung unten einen saubereren Zustand als er ist.
|
||||||
|
sudo systemctl stop ninlight-station 2>/dev/null || true
|
||||||
sudo nmcli con down "$AP_CONNECTION" >/dev/null 2>&1 || true
|
sudo nmcli con down "$AP_CONNECTION" >/dev/null 2>&1 || true
|
||||||
echo "Fehler: ninlight-station ist nach dem Start nicht aktiv - Zugangspunkt wieder abgeschaltet. Details: journalctl -u ninlight-station" >&2
|
echo "Fehler: ninlight-station ist nach dem Start nicht aktiv - Zugangspunkt wieder abgeschaltet. Details: journalctl -u ninlight-station" >&2
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -8,6 +8,14 @@ Description=ninlight recovery station (HTTP image server)
|
|||||||
# Prozess bei jedem Absturz (z.B. Bind-Fehler nach einem NM-Neustart) per
|
# Prozess bei jedem Absturz (z.B. Bind-Fehler nach einem NM-Neustart) per
|
||||||
# Restart=always in kurzen Abstaenden neu versuchen lassen.
|
# Restart=always in kurzen Abstaenden neu versuchen lassen.
|
||||||
After=network.target NetworkManager.service
|
After=network.target NetworkManager.service
|
||||||
|
# Steht der Zugangspunkt nicht, kann server.py 192.168.8.1 nicht binden und
|
||||||
|
# stirbt sofort; Restart=always versucht es alle RestartSec=2 erneut. Damit
|
||||||
|
# das nicht endlos das Journal flutet, sondern nach kurzer Zeit ehrlich
|
||||||
|
# aufgibt (und ninlight-station dann mit einer klaren Fehlermeldung reagieren
|
||||||
|
# kann statt in einer stillen Neustartschleife zu haengen), hier explizit
|
||||||
|
# gedeckelt statt sich auf systemds Vorgabewerte zu verlassen.
|
||||||
|
StartLimitIntervalSec=30
|
||||||
|
StartLimitBurst=5
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
|
|||||||
Reference in New Issue
Block a user