CLI AI

Dienst neu starten und wirklich prüfen, ob er läuft

2026-07-18

sudo systemctl restart nginx && systemctl is-active nginx startet den Dienst neu und gibt ein Wort dazu aus, ob er tatsächlich läuft. Der Neustart schweigt bei Erfolg genauso wie dann, wenn der Prozess eine Sekunde später stirbt — die Prüfung muss ein eigener Befehl sein. Und is-active antwortet auch bei einem vertippten Unit-Namen inactive: genau hier täuschen sich die meisten.

1. Neu starten und in derselben Zeile prüfen

clai
$ clai starte docker neu und sage mir ob er wieder läuft→ sudo systemctl restart docker && systemctl is-active dockeractive

restart gibt bei Erfolg nichts aus, und Schweigen beweist nichts. is-active liefert ein einzelnes Wort mit Exit-Code 0 — genau das, was nach && gebraucht wird.

2. Die Falle: Tippfehler im Unit-Namen

clai
$ clai prüfe ob der dienst nosuch läuft→ systemctl is-active nosuch.serviceinactive

Ein Unit, das es nicht gibt, antwortet inactive mit Exit-Code 4 — nicht "unit not found". Im Skript liest sich das als "Dienst gestoppt", obwohl Sie sich schlicht vertippt haben. status ist ehrlich: Unit nosuch.service could not be found.

3. Was status wirklich sagt

clai
$ clai zeige den zustand des dienstes docker→ systemctl status docker● docker.service - Docker Application Container Engine     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled)     Active: active (running) since Mon 2026-08-24 14:15:54 +07; 3 days ago Invocation: ca41df104d0f46f5a69c964621baf011TriggeredBy: ● docker.socket       Docs: https://docs.docker.com

Zwei Zeilen tragen die Bedeutung. Loaded sagt, dass die Unit-Datei gefunden wurde, enabled bedeutet Start beim Booten. Active enthält die Laufzeit: stehen dort Sekunden, obwohl Sie vor einer Minute neu gestartet haben, ist der Dienst abgestürzt und von selbst wiedergekommen.

4. Eine Prüfung für Skripte statt für Augen

clai
$ clai zeige den docker-zustand maschinenlesbar→ systemctl show -p ActiveState,SubState,MainPID,NRestarts dockerActiveState=activeSubState=runningMainPID=5425NRestarts=0

show formatiert nichts für Menschen und übersteht deshalb systemd-Updates, die die hübsche Ausgabe umbauen. Ein steigendes NRestarts ist das schnellste Zeichen dafür, dass eine Restart=-Politik eine Absturzschleife übertüncht.

5. Alles Gescheiterte finden

clai
$ clai zeige gescheiterte dienste→ systemctl --failed  UNIT              LOAD   ACTIVE SUB    DESCRIPTION● logrotate.service loaded failed failed Rotate log files

Kurz und sachlich. Für ein einzelnes Unit gibt systemctl is-failed <name> das Wort failed aus und endet mit Code 0, wenn es wirklich in diesem Zustand ist.

6. Den failed-Zustand zurücksetzen

clai
$ clai setze den fehlerzustand des dienstes logrotate zurück→ sudo systemctl reset-failed logrotate.service

Solange der Zustand nicht zurückgesetzt ist, steht das Unit in der --failed-Liste, und der Zähler StartLimitBurst kann neue Startversuche mit "start request repeated too quickly" ablehnen. reset-failed nullt den Zähler und nimmt das Unit aus der Liste.

Gotchas

  • Schweigen nach dem Neustart beweist nichts. systemctl restart gibt sowohl bei gesundem Dienst als auch bei sofortigem Tod nichts aus. Die Prüfung ist immer ein eigener Befehl.
  • is-active unterscheidet Tippfehler nicht von gestopptem Dienst. Beides ergibt inactive. Die Exit-Codes unterscheiden sich — 4 bei nicht existierendem Unit —, sichtbar ist das aber nicht, also greifen Sie bei überraschender Antwort zu status.
  • restart liest eine geänderte Unit-Datei nicht neu. Nach dem Bearbeiten einer .service-Datei braucht es sudo systemctl daemon-reload, sonst startet systemd die alte Fassung und Sie suchen den Fehler in einer längst korrigierten Konfiguration.

Related questions

Worin unterscheiden sich restart und reload? reload bittet den Dienst, seine Konfiguration ohne Verbindungsabbruch neu zu lesen; restart beendet den Prozess und startet ihn neu. Kann ein Unit kein reload, wählt reload-or-restart das Vorhandene.

Wie sehe ich, warum der Dienst nicht hochkam? journalctl -u <name> -n 50 -o cat zeigt die letzten Logzeilen ohne Zeitstempel-Präfixe — der Grund steht meist genau dort.

Woher weiß ich, dass er einen Neustart der Maschine übersteht? systemctl is-enabled <name> antwortet enabled oder disabled. Ein gerade laufender Dienst kann durchaus disabled sein und nach dem Booten fehlen.

See also

CliAI macht aus "starte ihn neu und sag mir, ob er läuft" beide Befehle und zeigt sie, bevor einer davon ausgeführt wird. In einer Zeile installieren.