Verwenden von Systemd-Timern als Ersatz für Cron-Jobs

Verwenden von Systemd-Timern als Ersatz für Cron-Jobs
Ein Foto einer Frau, die vor einem Laptop sitzt und einen Wecker hält.

Als Linux-Benutzer sind Sie wahrscheinlich mit Cron vertraut. Es hat viele Jahre lang als zeitbasierter Job-Scheduler unter Unix funktioniert. Jetzt verwenden viele Benutzer Systemd-Timer, um die Dominanz von Cron zu ersetzen. In diesem Artikel werden die Grundlagen erläutert, wie Sie Ihren eigenen Systemd-Timer einrichten und sicherstellen, dass er auf Ihrem System ordnungsgemäß ausgeführt wird.

Warum Systemd-Timer statt Cron verwenden?

Einer der größten Verkaufsargumente von Systemd Timers ist, dass es vollständig in das Systemd-Ökosystem integriert ist. Das bedeutet, dass es sehr einfach ist, verschiedene Systemd-Serviceeinheiten zu planen und miteinander zu verknüpfen, was die Automatisierung von Aufgaben im Vergleich zu einem herkömmlichen Cron-Daemon einfacher macht.

Ein Terminal, das einen Systemdienst zeigt, der einen Systemd-Timer verwendet.

Ein weiterer Vorteil von Systemd-Timern gegenüber Cron besteht darin, dass sie eine detailliertere Kontrolle darüber bieten, wie Ihre geplanten Jobs ausgelöst werden. Beispielsweise verfügen Systemd-Timer über eine OnBootSecVariable, mit der Sie Ihre Serviceeinheit verzögern können, bis nach einem erfolgreichen Start eine bestimmte Zeitspanne verstrichen ist.

Ein Terminal, das eine Beispiel-Timerkonfiguration mit einer speziellen Triggervariable zeigt.

Schließlich sind Systemd-Timer im Vergleich zu einem Standard-Cron-Daemon auch unglaublich genau. Standardmäßig kann er mithilfe seiner AccuracySecVariablen Jobs bis auf eine Mikrosekunde genau verfolgen und ausführen. Dies ist unglaublich hilfreich, wenn Sie einen Computer betreiben, der genaue Zeitangaben für seine geplanten Aufgaben benötigt.

Installieren von Systemd-Timern

Timer sind eine integrierte Funktion von Systemd. Das bedeutet, dass Ihr Computer diese Funktion bereits für einige seiner Systemprozesse nutzt, wenn Sie Systemd als Init-Daemon verwenden, wie dies bei beliebten Linux-Distributionen wie Arch, Fedora und Ubuntu der Fall ist.

Um zu überprüfen, ob Ihre Distribution Systemd ausführt, können Sie den folgenden Befehl ausführen:

Dadurch werden alle Systemd-Einheiten, Geräte und Timer aufgelistet, die derzeit auf Ihrem System ausgeführt werden.

Ein Terminal, das die Ausgabe des Befehls systemctl auf einer Systemd-basierten Linux-Distribution anzeigt.

Vorhandene Timer auflisten

Ob auf Ihrem aktuellen Benutzerkonto ein Timer läuft, können Sie am einfachsten mit dem folgenden Befehl überprüfen:

Sie können das --allFlag auch verwenden, um jeden einzelnen Timer im System zu überprüfen, einschließlich der inaktiven:

Dadurch werden Datum und Uhrzeit der Aktivierung jedes Timers, der Countdown bis zu diesem Zeitpunkt, die seit der letzten Ausführung vergangene Zeit, der Einheitenname des Timers selbst und der Dienst, den jede Timereinheit aktiviert, ausgedruckt.

Ein Terminal, das alle laufenden Systemd-Timer in der aktuellen Sitzung auflistet.

Erstellen eines neuen Dienstes und Timers

Der erste Schritt beim Erstellen eines Systemd-Timers besteht darin, entweder einen Dienst zu erstellen oder einen vorhandenen zu finden, an den er angehängt werden kann. Dies liegt daran, dass jeder Timer an eine übergeordnete Diensteinheit angehängt werden muss. Dieser Abschnitt führt Sie durch den Prozess zum Erstellen eines Timers für einen benutzerdefinierten Systemd-Dienst.

Beginnen Sie mit der Erstellung der leeren Dateien „.service“ und „.timer“ in Ihrem Home-Verzeichnis:

Öffnen Sie Ihre neue Servicedatei mit Ihrem bevorzugten Texteditor:

Fügen Sie die folgende Vorlage in Ihre neue Servicedatei ein:

Speichern Sie Ihre „.service“-Datei und öffnen Sie dann Ihre leere „.timer“-Datei mit demselben Texteditor:

Fügen Sie den folgenden Codeblock in Ihre Timerdatei ein:

Gehen Sie zum [Timer]Abschnitt und ersetzen Sie dann den Wert der OnCalendarVariablen durch das Datum und die Uhrzeit, zu der Ihre Systemd-Einheit ausgeführt werden soll. In meinem Fall möchte ich, dass mein Programm jeden Tag genau um 11:43 Uhr ausgeführt wird.

Ein Terminal, das den benutzerdefinierten Timerwert für die Variable OnCalendar hervorhebt.

Erstellen eines monotonen Timers

Neben der Einstellung eines Timers, der an einem bestimmten Datum läuft, ist es auch möglich, einen monotonen Timer zu erstellen, der relativ zur aktuellen Betriebszeit Ihres Computers läuft. Dies ist nützlich, wenn Sie eine Aufgabe auf einem Computer planen, der nicht ständig läuft, z. B. auf einem Desktop oder einem Laptop.

Öffnen Sie zunächst Ihre „.timer“-Datei und scrollen Sie dann nach unten zum [Timer]Abschnitt.

Ein Terminal mit der Anzeige des Standorts der

Entfernen Sie die Variablen OnCalendarund und fügen Sie dann ein Zeitintervall hinzu, in dem Sie Ihre Unit-Datei ausführen möchten. Wenn Sie beispielsweise „1hr“ festlegen, wird Systemd angewiesen, Ihren Befehl eine Stunde nach dem erfolgreichen Start Ihres Computers auszuführen.PersistentOnBootSec

Ein Terminal, das die Variable OnBootSec hervorhebt und die ursprünglichen Zeitvariablen der benutzerdefinierten Timerdatei ersetzt.

Fügen Sie die OnUnitActiveSecVariable direkt darunter hinzu OnBootSecund geben Sie dann das Intervall an, in dem Ihr Timer nach dem Systemstart kontinuierlich laufen soll. In meinem Fall stelle ich es auf „30min“, da ich möchte, dass meine Aufgabe nach dem ersten Durchlauf alle 30 Minuten ausgeführt wird.

Ein Terminal, das die Variable OnUnitActiveSec hervorhebt, die den Einzellauf-Timer in einen monotonen Timer umwandelt.

Erstellen eines transienten Timers

Einer der Vorteile der tiefen Integration von Systemd Timer in Systemd besteht darin, dass es die anderen angrenzenden Programme des Init-Daemons nutzen kann. So ist es beispielsweise möglich, Timer mit Systemd-run zu verwenden, um einmalige, vorübergehende Jobs auf Ihrem Computer zu erstellen.

Um einen einfachen temporären Timer zu erstellen, fügen Sie die folgende Codezeile in eine Terminalsitzung ein und ersetzen Sie dann den Wert der --on-calendarVariablen durch das Intervall, in dem Ihr Befehl ausgeführt werden soll:

Fügen Sie den Befehl, den Sie ausführen möchten, am Ende der Zeile an und drücken Sie dann , Enterum ihn zu planen.

Sie können auch temporäre monotone Timer erstellen, indem Sie die Variablen --on-bootund --on-unit-activeverwenden:

Bestätigen Sie, dass Ihr temporärer Timer jetzt in der Warteschlange des Job-Schedulers von Systemd steht, indem Sie den folgenden Befehl ausführen:

Ein Terminal, das den Status eines im System geladenen vorübergehenden Timers anzeigt.

Ausführen des Systemd-Timers

Um Ihren neuen Systemd-Timer auszuführen, müssen Sie sicherstellen, dass er in Ihrer aktuellen Systemd-Sitzung ordnungsgemäß geladen wird. Kopieren Sie dazu sowohl Ihren benutzerdefinierten Dienst als auch die Timer-Datei in das Dienstverzeichnis Ihres Systemd:

Laden Sie die aktuelle Konfiguration des Init-Daemons neu:

Aktivieren Sie sowohl den Dienst als auch den Timer, die Sie erstellt haben, mit systemctl:

Überprüfen Sie, ob Sie Ihren neuen Timer richtig geladen haben, indem Sie Folgendes sudo systemctl status my-new-timer.timerin einer neuen Terminalsitzung ausführen: In diesem Fall können Sie sehen, dass mein Timer jetzt geplant und für die Ausführung im System vorbereitet ist.

Ein Terminal, das die im aktuellen System ausgeführte Timerdatei anzeigt.

Zu lernen, wie man Aufgaben mit Systemd-Timern plant, ist nur ein Teil des Verständnisses, wie Ihr Linux-Rechner unter der Haube funktioniert. Tauchen Sie tiefer in die internen Vorgänge dieses wunderbaren Betriebssystems ein, indem Sie unseren Vergleichsartikel zu Grub und Systemd-Boot lesen.

Bildnachweis: Alexandr Podvalny via Unsplash . Alle Änderungen und Screenshots von Ramces Red.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert