Layer 8Ehrlicher Tech-Support
BetriebssystemSchweregrad: Lästig

systemd: Dienst startet nicht mehr, start-limit-hit

Nach ein paar schnellen Abstürzen weigert sich systemd, den Dienst überhaupt noch zu starten. Das ist die Startratenbegrenzung, kein zweiter Fehler.

Aufwand:
ca. 15 Min.
Voraussetzung:
Ein Terminal mit Root-Rechten oder sudo, systemctl und journalctl, Zugriff auf die Unit-Datei des Dienstes oder ein Drop-in-Verzeichnis unter /etc/systemd/system/
Gilt für:
Linux mit systemd laut Handbuchseiten systemd.unit(5), systemd.service(5), systemd-system.conf(5) und systemctl(1) auf man7.org (systemd 262~devel, abgerufen 17.10.2026); lokale Beobachtung auf systemd 258 (Fedora)

Das Symptom

Ein Dienst ist nach einem Update kaputt. Das ist ärgerlich, aber verständlich. Nicht verständlich ist, was danach passiert: Nach der Korrektur der Konfiguration verweigert systemd den Start komplett. systemctl status zeigt den Zustand failed und eine Zeile sinngemäß Start request repeated too quickly, dazu Failed with result 'start-limit-hit'. Kein Fehler des Programms, keine Ausgabe, einfach nichts. Auch systemctl start ändert daran nichts. Minuten später, nach Kaffee und Ratlosigkeit, geht es plötzlich wieder, ohne dass jemand etwas getan hätte.

Die „Layer 8“-Wahrheit

Die zweite Meldung ist keine zweite Störung, sondern eine Schutzvorrichtung. systemd führt pro Unit einen Zähler, wie oft sie in einem Zeitfenster gestartet wurde. systemd.unit(5) beschreibt die Regel: „Units which are started more than burst times within an interval time span are not permitted to start any more.“ Die Vorgaben, wenn die Unit nichts anderes sagt, stehen in systemd-system.conf(5): „DefaultStartLimitIntervalSec= defaults to 10s. DefaultStartLimitBurst= defaults to 5.“ Fünf Starts in zehn Sekunden, danach ist Schluss.

Dahin kommt ein Dienst schneller, als man die Fehlermeldung lesen kann. Mit Restart=always oder on-failure startet systemd ihn nach jedem Abbruch neu, und die Wartezeit RestartSec= steht laut systemd.service(5) auf 100ms. Ein Programm, das wegen einer fehlerhaften Konfigurationszeile sofort beendet, wird also fünfmal innerhalb einer halben Sekunde gestartet und dann gesperrt. Was im Journal darüber steht, die eigentliche Fehlerausgabe, hat man in dem Moment meist noch nicht gelesen.

Der Teil, der die Ratlosigkeit erzeugt, steht im selben Absatz der Handbuchseite: Die Begrenzung „apply to all kinds of starts (including manual), not just those triggered by the Restart= logic.“ Deshalb bleibt auch der handgestartete Versuch wirkungslos, obwohl die Konfiguration inzwischen stimmt. Und deshalb geht es Minuten später wieder: Nach Ablauf des Intervalls darf die Unit laut Handbuchseite wieder manuell, per Timer oder Socket gestartet werden, und die Restart-Logik ist von da an wieder aktiv. Der Kaffee war nicht die Lösung, das Zeitfenster war abgelaufen.

Der direkte Weg führt über den Zähler. systemctl reset-failed setzt laut systemctl(1) den Zustand failed zurück, und systemd.unit(5) ergänzt, dass der Befehl auch den Zähler der Startratenbegrenzung löscht, genau für den Fall, dass ein Administrator eine Unit von Hand starten will und das Limit im Weg steht. Danach startet der Dienst sofort, vorausgesetzt, die Ursache ist wirklich behoben. Ist sie es nicht, steht man nach fünf weiteren Abstürzen am selben Punkt.

Die Versuchung, das Limit mit StartLimitIntervalSec=0 abzuschalten, ist deshalb die falsche Lehre aus dem Vorfall. Die Begrenzung existiert, damit ein defekter Dienst nicht im Hundert-Millisekunden-Takt das Journal flutet. Wer Dienste betreibt, die beim Hochfahren auf andere warten, gibt ihnen mit RestartSec= Luft und setzt das Fenster mit StartLimitIntervalSec= und StartLimitBurst= bewusst, im Abschnitt [Unit], nicht in [Service]. Dann bleibt die Sperre, was sie sein soll: ein Hinweis, dass etwas fünfmal hintereinander schiefging, und nicht die sechste Störung.

Die echte, verifizierte Lösung

1000 % faktenbasiert. Jeder Befehl ist real, jeder Pfad existiert. Schritt für Schritt:

  1. 1.

    Die eigentliche Ursache im Journal lesen

    Die Ratenbegrenzung ist das letzte Glied einer Kette. journalctl -u zeigt die Meldungen des Dienstes in Reihenfolge; die interessanten Zeilen stehen vor der Verweigerung: die Fehlerausgabe des Programms, ein fehlender Pfad, ein belegter Port, eine fehlende Konfigurationsdatei. systemctl status gibt den Exit-Code und den Zustand failed aus. Laut systemctl(1) bleibt dieser Zustand samt Exit-Code für den Administrator erhalten, bis die Unit gestoppt, neu gestartet oder per reset-failed zurückgesetzt wird.

    systemctl status meindienst.service
    journalctl -u meindienst.service -n 100 --no-pager
    
  2. 2.

    Die geltenden Grenzwerte dieser Unit anzeigen

    systemctl show gibt die wirksamen Werte der Unit aus, egal ob sie aus der Unit-Datei, einem Drop-in oder den Manager-Vorgaben stammen. Sind in der Unit keine eigenen Werte gesetzt, erscheinen die Vorgaben aus systemd-system.conf(5), also zehn Sekunden und fünf Starts. Für die Manager-Vorgaben selbst lässt sich systemctl show ohne Unit-Namen aufrufen; auf dem Prüfsystem lieferte das DefaultStartLimitIntervalUSec=10s und DefaultStartLimitBurst=5.

    systemctl show meindienst.service -p StartLimitIntervalUSec -p StartLimitBurst -p Restart -p RestartUSec
    systemctl show -p DefaultStartLimitIntervalUSec -p DefaultStartLimitBurst
    
  3. 3.

    Ursache beheben, Zähler zurücksetzen, starten

    Erst wenn der Grund für die Abstürze behoben ist, lohnt der Start. reset-failed setzt laut systemctl(1) den Zustand failed zurück und löscht laut systemd.unit(5) den Zähler der Startratenbegrenzung. Danach ist der Start wieder erlaubt. Wer den Zähler zurücksetzt, ohne die Ursache zu beheben, sieht innerhalb von Sekunden dieselbe Meldung wieder, diesmal mit fünf weiteren Absturzprotokollen im Journal.

    systemctl reset-failed meindienst.service
    systemctl start meindienst.service
    
  4. 4.

    Neustartverhalten passend einstellen

    Für Dienste, die bei Abhängigkeiten wie einer Datenbank legitim mehrfach scheitern können, lohnt ein Drop-in. RestartSec= legt laut systemd.service(5) die Wartezeit vor dem Neustart fest und steht standardmäßig auf 100ms; ein paar Sekunden Pause nehmen dem Zähler den Druck. StartLimitIntervalSec= und StartLimitBurst= gehören in den Abschnitt [Unit]. Nach dem Anlegen des Drop-ins muss der Manager seine Konfiguration neu laden, sonst gilt weiter die alte Unit.

    # /etc/systemd/system/meindienst.service.d/neustart.conf
    [Unit]
    StartLimitIntervalSec=60
    StartLimitBurst=5
    
    [Service]
    RestartSec=5
    # anschließend:
    # systemctl daemon-reload
    
  5. 5.

    Beim Entwickeln eigener Dienste die Grenze einplanen

    Wer einen eigenen Dienst mit Restart=always ausliefert, baut sich die Sperre selbst, wenn das Programm bei einem Konfigurationsfehler sofort beendet. systemd.service(5) nennt für Restart= die Werte no, on-success, on-failure, on-abnormal, on-watchdog, on-abort und always; die Voreinstellung ist no. Ein Dienst, der bei dauerhaft fehlerhafter Konfiguration abbricht, sollte das deutlich protokollieren und mit einem Exit-Code enden, bei dem ein Neustart keinen Sinn hat. Das erspart dem Administrator das Rätselraten, ob der Dienst kaputt ist oder nur gesperrt.

Häufige Fragen (FAQ)

?Warum startet der Dienst nicht einmal mehr von Hand?

Weil die Startratenbegrenzung für alle Starts gilt, nicht nur für die automatischen. systemd.unit(5) beschreibt StartLimitIntervalSec= und StartLimitBurst= so: „Units which are started more than burst times within an interval time span are not permitted to start any more.“ Und weiter: Die Optionen sind besonders nützlich zusammen mit Restart=, „however, they apply to all kinds of starts (including manual), not just those triggered by the Restart= logic.“ Ein systemctl start innerhalb des Intervalls zählt also mit und wird genauso abgewiesen.

?Wie viele Starts in welcher Zeit sind erlaubt?

Wenn die Unit nichts anderes festlegt, gelten die Vorgaben des Managers. systemd-system.conf(5): „DefaultStartLimitIntervalSec= defaults to 10s. DefaultStartLimitBurst= defaults to 5.“ Fünf Starts in zehn Sekunden, der sechste wird verweigert. Auf dem Prüfsystem mit systemd 258 zeigte systemctl show genau diese Werte. Ein Dienst, der sofort nach dem Start abstürzt und mit Restart=always und der Voreinstellung RestartSec=100ms neu gestartet wird, erreicht die Grenze in unter einer Sekunde.

?Heißt die Meldung, dass mein Dienst kaputt ist?

Sie heißt, dass er kurz hintereinander zu oft gestartet wurde. Warum er jedes Mal gleich wieder endete, steht in den Journal-Zeilen davor; die Ratenbegrenzung ist nur die Folge. Wer die Meldung als Ursache behandelt und das Limit hochdreht, bekommt einen Dienst, der 50 Mal statt 5 Mal abstürzt. Die Reihenfolge ist deshalb: Journal des Dienstes lesen, den Grund für das Beenden beheben, dann den Zähler zurücksetzen und starten.

?Wie komme ich aus der Sperre heraus, ohne zu warten?

Mit systemctl reset-failed. systemd.unit(5) sagt dazu: „systemctl reset-failed will cause the restart rate counter for a service to be flushed, which is useful if the administrator wants to manually start a unit and the start limit interferes with that.“ Alternativ läuft die Sperre ab: Nach Ablauf des Intervalls darf die Unit laut Handbuchseite wieder manuell, per Timer oder Socket gestartet werden, und die Restart-Logik ist dann wieder aktiv. Ohne Behebung der Ursache fängt der Zähler danach nur wieder von vorn an.

?Soll ich StartLimitIntervalSec=0 setzen, damit das nie wieder passiert?

Nur mit Bedacht. Laut systemd.unit(5) darf das Intervall auf 0 gesetzt werden, um jede Ratenbegrenzung abzuschalten. Dann startet systemd einen kaputten Dienst mit Restart=always endlos neu, mit allem, was das an Log-Zeilen und Last mit sich bringt. Sinnvoller ist, RestartSec= zu erhöhen, damit Abstürze nicht im Hundert-Millisekunden-Takt gezählt werden, oder StartLimitBurst= moderat anzuheben. Die Einstellungen gehören laut systemd.unit(5) in den Abschnitt [Unit], nicht in [Service].

Belege

Diese Seite ist gegen die folgenden Primärquellen geprüft – Hersteller, Standard oder Gesetzestext. Wer es nicht glaubt, muss es nicht: Da steht, wo es nachzulesen ist.

Zuletzt geprüft am . Dokumentation altert – ein Datum daneben ist der einzige ehrliche Umgang damit.

Auch zu finden unter

Verwandte Fehler

OSLästigUnit is masked

systemctl: Unit is masked

systemctl startet den Dienst nicht: 'Unit is masked'. Die Unit ist auf /dev/null verlinkt. So machst du sie mit unmask wieder startbar.

OSLästigThere are no more endpoints available from the endpoint mapper

WSL 2 scheitert, weil der ICS-Dienst abgeschaltet wurde

Keine neue WSL-2-Distribution, die Umstellung von WSL 1 meldet no more endpoints. Oft hat ein Tuning-Skript den Dienst SharedAccess deaktiviert.

OSLästigArgument list too long

bash: Argument list too long

Der Befehl bricht mit 'Argument list too long' ab, weil ein * zu viele Dateien liefert. So löst du es mit find und xargs statt Globbing.