Überspringt die System-Timer-Einheit den nächsten Lauf, wenn der Vorgang noch nicht abgeschlossen ist?

18

Ich möchte systemd verwenden, um alle 5 Minuten einen Befehl auszuführen. Es besteht jedoch die Gefahr, dass die Ausführung der Aufgabe gelegentlich länger als 5 Minuten dauert. Wird systemd zu diesem Zeitpunkt eine zweite Instanz des Befehls starten, dh werden am Ende 2 Prozesse ausgeführt?

Ist es möglich, systemd anzuweisen, keinen zweiten Prozess zu starten, wenn der erste noch nicht abgeschlossen ist? Wenn nicht, was sind gute Workarounds?

Hinweis: Ich hoffe, die Antwort lautet "Das ist das Standardverhalten. Es ist einfach nicht dokumentiert." Wenn dies der Fall ist, kann mir jemand sagen, wie ich einen Bug gegen seine Dokumente einreichen kann?

Hinweis: Cron hat ein ähnliches Problem, das unter /unix//a/173928/11244 behandelt wird . Ich suche das systemd-Äquivalent.

TomOnTime
quelle

Antworten:

27

Dies ist das Standardverhalten (und das einzige). Es ist nicht explizit dokumentiert, aber durch die Operationslogik von systemd impliziert.

systemd.timer (5) lautet:

Für jede Timer-Datei muss eine passende Unit-Datei vorhanden sein, die beschreibt, welche Unit nach Ablauf des Timers aktiviert werden soll .

systemd (1) beschreibt seinerseits das Konzept von Einheitszuständen und Übergängen zwischen ihnen:

Einheiten können "aktiv" (dh gestartet, gebunden, eingesteckt, ..., abhängig vom Einheitentyp, siehe unten) oder "inaktiv" (dh gestoppt, ungebunden, nicht eingesteckt, ...) sein sowie in der Vorgang des Aktivierens oder Deaktivierens , dh zwischen den beiden Zuständen (diese Zustände werden "Aktivieren", "Deaktivieren" genannt).

Dies bedeutet, dass das Auslösen eines Timers zur "Aktivierung" der Anpassungseinheit führt, dh zu ihrem Übergang in den "aktiven" Zustand.

Wenn die passende Einheit zum Zeitpunkt der "Aktivierung" bereits "aktiv" ist (für eine Serviceeinheit bedeutet dies, dass "der Hauptprozess noch läuft", es sei denn, die Serviceeinheit hat Type=oneshotund RemainAfterExit=true), sollte klar sein, dass keine Aktion ausgeführt wird genommen.

intelfx
quelle
Könnten Sie "oneshot" -Dienstleistungen klären? Meiner Meinung nach sollte ein "oneshot" -Dienst unter keinen Umständen eine weitere Kopie ausführen (manpage: process muss beendet werden, bevor systemd Follow-up-Einheiten startet)
Gima
1
@Gima Eine OneShot-Einheit ohne zusätzliche Parameter wird als "aktiv" betrachtet, während der anfängliche Prozess ausgeführt wird, und wird "inaktiv", wenn sie beendet wird. Zu diesem Zeitpunkt kann ein anderer Auslöser diese Einheit wieder aktivieren.
intelfx
1
@Gima ... jedoch RemainAfterExit=truebleibt eine OneShot-Einheit "aktiv", wenn der ursprüngliche Prozess beendet wird, sodass nachfolgende Auslöser eines Timers ignoriert werden, es sei denn, ein Administrator deaktiviert diese Einheit explizit (stoppt sie) oder sie wird durch ein negatives Ergebnis herabgesetzt Abhängigkeiten.
intelfx
1
Ich bekomme immer Wiederholung, wenn Leute das einladen. Ich hoffe, systemd klärt ihre Dokumente nicht.
TomOnTime
1
Dies ist jetzt Teil der systemd docs - Note that in case the unit to activate is already active at the time the timer elapses it is not restarted, but simply left running. There is no concept of spawning new service instances in this case. freedesktop.org/software/systemd/man/systemd.timer.html
Sam