StartdimitIntervalSec und StartLimitBurst von Systemd funktionieren nie

12

Ich habe versucht, die Anzahl der Neustarts eines Dienstes (in einem Container) einzuschränken. Die Betriebssystemversion ist centos-release-7-5, die Servicedatei ist wie folgt (einige Parameter wurden entfernt, um das Lesen zu vereinfachen). Es sollte ziemlich einfach sein, wie einige andere Beiträge betonten (Neustartlimit 1 für Post of Server-Fehler, Limit 2 für Neustart nach Stapelüberlauf). StartLimitBurst und StartLimitIntervalSec funktionieren jedoch nie für mich.

Ich habe auf verschiedene Arten getestet: (1) Ich überprüfe die Dienst-PID und beende den Dienst mehrmals mit "kill -9 ****". Der Dienst wird immer nach 20s neu gestartet! (2) Ich habe auch versucht, die Servicedatei durcheinander zu bringen, damit der Container nie läuft. Trotzdem funktioniert es nicht, die Servicedatei wird immer wieder neu gestartet.

Irgendeine Idee?

[Unit]
Description=Hello Fluentd
After=docker.service
Requires=docker.service
StartLimitBurst=2
StartLimitIntervalSec=150s

[Service]
EnvironmentFile=/etc/environment
ExecStartPre=-/usr/bin/docker stop "fluentd"
ExecStartPre=-/usr/bin/docker rm -f "fluentd"
ExecStart=/usr/bin/docker run fluentd
ExecStop=/usr/bin/docker stop "fluentd"
Restart=always
RestartSec=20s
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target
Batilei
quelle
2
Dies ist wichtiger als jemand, der vergisst, "Sec" einzugeben, wie die Antworten zeigen. Ich halte es nicht für hilfreich, eine solche Frage zu schließen, die mit so vielen Details gestellt wurde, die wir wollen.
Sourcejedi

Antworten:

21

StartLimitIntervalSec=wurde als Teil von systemd v230 hinzugefügt. In systemd v229 und niedriger können Sie nur verwenden StartLimitInterval=. Sie müssen auch StartLimitInterval=und StartLimitBurst=in den [Service]Abschnitt setzen - nicht den [Unit]Abschnitt.

Führen Sie aus, um Ihre systemd-Version unter CentOS zu überprüfen rpm -q systemd.

Wenn Sie jemals ein Upgrade auf systemd v230 oder höher durchführen, funktionieren die alten Namen in diesem [Service]Abschnitt weiterhin.

Quelle: https://lists.freedesktop.org/archives/systemd-devel/2017-July/039255.html

Sie können dieses Problem haben, ohne dass ein Fehler auftritt, da systemd unbekannte Anweisungen ignoriert. systemd geht davon aus, dass viele neuere Anweisungen ignoriert werden können und der Dienst dennoch ausgeführt werden kann.

Es ist möglich, eine Einheitendatei manuell auf unbekannte Anweisungen zu überprüfen. Zumindest scheint es auf neueren systemd zu funktionieren:

$ systemd-analyze verify foo.service
/etc/systemd/system/foo.service:9: Unknown lvalue 'FancyNewOption' in section 'Service'
sourcejedi
quelle
Das ist interessant. Sie schlagen vor, den StartLimitBurstAbschnitt [Service] einzutragen, aber die Dokumentation besagt, dass er sich im Abschnitt [Unit] befinden sollte. freedesktop.org/software/systemd/man/systemd.unit.html StartLimitIntervalSec=interval, StartLimitBurst=burst Configure unit start rate limiting. Units which are started more than burst times within an interval time interval are not permitted to start any more.
Ikrom
1
@Ikrom In systemd v229 und darunter
sourcejedi
@sourcejedi Danke! Ich habe gerade systemd auf meinem centos 7 überprüft /usr/lib/systemd/systemd --versionund es war v219. Ich muss auf die systemd-Version achten.
Ikrom
+10 wenn ich könnte. Ich habe schon mehrmals nach dieser Lösung gesucht (und anscheinend schlecht gegoogelt). Neu für mich ist auch systemd-analyze. Vielen Dank!
JCotton
Es scheint, dass dies systemd-analyzenur für bereits installierte Servicedateien funktioniert, nicht für eine lokale Datei, die Sie schreiben möchten, aber noch nicht installiert haben. (Zumindest scheint dies bei meinen Versuchen, es zu verwenden, auf Version 219 der Fall zu sein.) Wenn dies zutrifft, ist es möglicherweise wert, es in dieser Antwort zu erwähnen.
Mhucka
5

Ich glaube, ich habe das Problem gefunden. Alle Online- Dokumente schlagen vor, dass sich alle Parameter in der UNIT-Datei ( systemd unit file ) befinden, aber immer noch in meinem System (centos 7.5) in der Servicedatei. Außerdem lautet der Name "StartLimitInterval", nicht "StartLimitIntervalSec".

Batilei
quelle