So planen Sie Aufgaben mit Systemd -Timern unter Linux

So planen Sie Aufgaben mit Systemd -Timern unter Linux

Der traditionelle Weg, Aufgaben unter Linux zu planen, besteht darin, den Cron -Daemon zu verwenden, Zeitintervalle anzugeben und
Befehle, die in Crontabs ausgeführt werden sollen.

Systemd, das relativ neue Init -System, das jetzt von allen wichtigen Linux -Verteilungen verwendet wird Einheiten, genannt Timer. In diesem Artikel erfahren wir, wie sie strukturiert sind und einige Beispiele für ihre Verwendung.

In diesem Tutorial lernen Sie:

  • Die Grundstruktur von Systemd -Timern;
  • Wie man monotonische und Echtzeit -Timer erstellt;
  • Wie man aktive Timer auflistet und inspiziert;
  • Wie man Timer aktiviert;
  • Wie man Transienten -Timer verwendet;


Softwareanforderungen und Konventionen verwendet

Softwareanforderungen und Linux -Befehlszeilenkonventionen
Kategorie Anforderungen, Konventionen oder Softwareversion verwendet
System Verteilungsunabhängige
Software Systemd
Andere Kenntnis von grundlegenden Systemkonzepten
Konventionen # - erfordert, dass gegebene Linux -Befehle mit Root -Berechtigungen entweder direkt als Stammbenutzer oder mit Verwendung von ausgeführt werden können sudo Befehl
$ - Erfordert, dass die angegebenen Linux-Befehle als regelmäßiger nicht privilegierter Benutzer ausgeführt werden können

Grundnutzung



Die Planung einer Aufgabe über Systemd umfasst die Verwendung von zwei verschiedenen Einheitstypen: Timer Und Dienstleistungen. Erstere sind Einheitsdateien mit dem .Timer Erweiterung: In ihnen definieren wir den Stellenplan und setzen die ausgelöste Serviceeinheit fest. Letztere sind die häufigsten Einheitentypen: Sie werden verwendet, um Dienste für moderne Linux -Verteilungen zu definieren und werden durch die identifiziert .Service Verlängerung.

Wir verwenden Serviceeinheiten, um den zu ausgeführten Befehl festzulegen (wenn Sie mit den grundlegenden System -Konzepten nicht vertraut sind, möchten Sie sich möglicherweise unseren Artikel über Systemd Services ansehen).

Je nachdem, wie der Zeitplan erstellt wird, kann ein Timer sein:

  1. Monoton
  2. Echtzeit

Monotonische Timer

Systemd enthält eine Liste von Schlüsselwörtern, die wir in einer Timereinheit verwenden können, um die Ausführung einer Aufgabe eine bestimmte Zeit nach einem vordefinierten Ereignis zu planen. Die Schlüsselwörter müssen in der verwendet werden [Timer] Abschnitt der Timereinheit.

Lassen Sie uns sie sehen und ihre Bedeutung erklären:



Stichwort Bedeutung
Onactivesec Planen Sie die Aufgabe relativ bis zu der Zeit, in der die Timereinheit selbst aktiviert ist
Onbootsec Planen Sie die Aufgabe relativ zur Systemstartzeit
OnStartupsec Planen Sie die Aufgabe relativ bis zu dem Zeitpunkt, zu dem Systemd startete
OnunitactiveSec Planen Sie die Aufgabe relativ auf das letzte Mal, als die Serviceinheit aktiv war
Onunitinactivesec Planen Sie die Aufgabe relativ auf das letzte Mal, als die Serviceinheit inaktiv war

Wie aus dem Namen der Schlüssel leicht erraten werden kann, werden „Sekunden“ als Standardeinheit der Zeit verwendet. Wir können jedoch nach dem Wert eine andere Einheit angeben (e.G. 15 m - fünfzehn Minuten). Wie wir später sehen werden, können die Schlüsselwörter in einer Timereinheit kombiniert werden.

Echtzeit -Timer

Ein Ereignis kann auch in „absolut“ geplant werden, ähnlich wie wir es über Cron definieren würden Oncalendar Schlüsselwort und erlaubte Zeitcodierungen.

Hier sind einige Beispiele:



Zeitspezifikation Erläuterung
Mi 18:00:00 Die Aufgabe wird jeden Mittwoch um 18:00 Uhr ausgeführt
Mon… Mi *-5-27 Die Aufgabe wird am 27. Mai eines jeden Jahres ausgeführt, jedoch nur an Tagen von Montag bis Mittwoch
2020-05-27 Die Aufgabe wird am 27. Mai des Jahres 2020 um 00:00:00 Uhr ausgeführt
Thu, Fr 2020-*-1,5 11:12:13 Die Aufgabe wird um 11:12:13 Uhr des ersten und fünften Tags eines jeden Monats des Jahres 2020 ausgeführt, aber nur, wenn der Tag ein Donnerstag oder ein Freitag ist
*: 0/2 Die Aufgabe wird alle zwei Minuten ab dem Jahr 0 ausgeführt
15/2 Die Aufgabe wird alle zwei Stunden ab 15:00 Uhr ausgeführt
stündlich Die Aufgabe wird zu Beginn jeder Stunde ausgeführt
täglich Die Aufgabe wird jeden Tag um 00:00:00 Uhr ausgeführt
wöchentlich Die Aufgabe wird jeden Montag um 00:00:00 Uhr ausgeführt
monatlich Die Aufgabe wird am ersten Tag eines jeden Monats um 00:00:00 Uhr ausgeführt

Die Wochentage müssen, falls angegeben, entweder in der abgekürzten (MID) oder vollständigen Form (Mittwoch) in englischer Sprache sein (der Fall spielt keine Rolle).

Wir können eine Liste der Zeitwerte angeben, indem wir die , Zeichen und geben Sie einen Wertebereich an . A * Der Charakter entspricht jedem Wert. Weitere Beispiele finden Sie in der Beratung der systemd.Zeit Manpage.

Aktive Timer auflisten

Alle aktiv auflisten Timereinheiten In unserem System können wir die starten Listenvorrichtungen Unterbefehl von Systemctl. Es sei denn, die --alle Die Option wird an den Befehl übergeben, nur die aktiven Timer sind im Ergebnis enthalten. Hier ist ein Beispiel für die Ausgabe, die durch den Befehl erzeugt wird:

$ SystemCTL List-Timer NÄCHSTE LINKS ZULETZT BESTANDEN EINHEIT Aktiviert Sonne 2020-01-19 19:36:06 CET 5H 15 min links Sa 2020-01-18 10:38:59 CET 1 DAY 3H SYSTEMD-TMPFILES-CLEAN.Timer systemd-tmpfiles-Clean.Service Mo 2020-01-20 00:00:00 CET 9H LASSSE SONNE 2020-01-19 00:00:16 CET vor 14H.Timer Man-db.Service Mo 2020-01-20 00:00:00 CET 9H Links Sonne 2020-01-19 00:00:16 CET vor 14h.Timerschatten.Service 

Der Bericht ist sehr detailliert. Es enthält 6 Spalten, die in der Reihenfolge beschrieben werden:

  1. Das nächste Mal wird der Timer ausgeführt (NÄCHSTE);
  2. Wie oft wird Timer das nächste Mal wieder laufen (LINKS);
  3. Das letzte Mal, als der Timer lief (ZULETZT);
  4. Wie viel Zeiten sind seit dem letzten Mal vergangen, als der Timer lief (BESTANDEN);
  5. Der Timereinheit in dem der Zeitplan festgelegt ist (EINHEIT);
  6. Der Serviceeinheit durch den Timer aktiviert (Aktiviert).


Ein Beispiel in der realen Welt

Lassen Sie uns die untersuchen MAN-DB.Timer Timer. Um das Gerät zu inspizieren, können wir SystemCTL und die verwenden Katze Unterbefehl:

$ systemctl cat Man-db.Timer

Hier ist die Timer -Definition:

[Einheit] Beschreibung = tägliche Man-DB-Regenerationsdokumentation = Mann: Mandb (8) [Timer] OnCalendar = Daily Accuracysec = 12H persistent = true [install] suchtBy = Timer.Ziel 

Das erste, was wir bemerken können, ist die [Einheit] Strophe, die allen Systemtypen gemeinsam ist. Hier wird es verwendet, um eine Beschreibung des Geräts bereitzustellen: Wir können sehen, dass der Timer verwendet wird, um eine „tägliche Regeneration von Man-DB“ durchzuführen.

Der Abschnitt, der uns am meisten interessiert, ist jedoch [Timer]. Diese Strophe ist spezifisch für Timereinheiten: Hier wird der Zeitplan definiert. Der Oncalendar Schlüsselwort wird verwendet, um a zu setzen täglich Echtzeitplan.

Wir können auch beobachten, dass zwei andere Schlüsselwörter verwendet werden: Accuracysec Und Hartnäckig. Ersteres wird verwendet, um eine maximale Verzögerung festzulegen, bei der der Service gestartet werden kann. In diesem Fall ist der Wert 12h, Der Befehl könnte also maximal 12 Stunden verzögert werden. Der Standardwert für Accuracysec Ist 1 Minute; Die beste Genauigkeit wird mit dem erhalten 1ns Notation (1 Nanosekunde).



Das andere Schlüsselwort, Hartnäckig, Noch. Wenn aus irgendeinem Grund ein geplanter Lauf übersehen wird, wird der Service beim nächsten Zeitpunkt sofort gestartet, wenn er in der verstrichenen Zeit mindestens einmal ausgelöst worden wäre. Dies kann beispielsweise nützlich sein, um Zeitpläne auszuführen, die aufgrund eines Systems, das nachgeschaltet ist.

Indem wir uns die Timer -Definition genauer ansehen, können wir feststellen, dass der ausgelöste Dienst nicht ausdrücklich erwähnt wird: Wenn dies geschieht, sucht Systemd nach einer Serviceinheit mit demselben Namen wie der Timer (in diesem Fall also in diesem Fall MAN-DB.Service). Um eine Serviceeinheit ausdrücklich zu verweisen, müssen wir die verwenden Einheit Stichwort.

Einen Timer aktivieren

Der Aktivieren eines Timers ist recht einfach. Alles was wir tun müssen, ist, es zusammen mit dem Service zu platzieren, sollte in der /etc/systemd/system Verzeichnis. Mit allen vorhandenen Dateien führen wir aus:

$ sudo systemctl starten .Timer

Damit ein Timer beim Start automatisch aktiviert wird (oder wenn ein anderes spezielles Ziel erreicht ist), müssen wir nur sicherstellen, dass es eine hat [Installieren] Stanza, wo wir angeben, wann die Aktivierung stattfinden soll.

Im obigen Beispiel der Gesucht von Das Schlüsselwort wird verwendet, um eine umgekehrte (schwache) Abhängigkeit einer bestimmten Zieleinheit zu etablieren (Timer.Ziel - Ein Ziel erreichte ziemlich früh im Startprozess) auf der von uns konfigurierenden Timereinheit: Bevor das Ziel erreicht ist, sollte unsere Einheit aktiviert werden.

Transient -Timer

Es ist möglich, die Ausführung von Aufgaben „on the Fly“ zu planen, ohne manuell dedizierte Timer- und Serviceinheiten durch Verwendung manuell zu erstellen systemd-run. Der Befehl erzeugt temporäre Einheiten (sie überleben keinen Neustart) innerhalb der /run/systemd/transient Verzeichnis, falls global und im Inneren laufen /run/user // systemd/transient Verzeichnis, wenn er als bestimmter Benutzer gestartet wird (--Benutzer Möglichkeit).

Lassen Sie uns ein Beispiel sehen. Angenommen, wir möchten, dass Datum und Uhrzeit jede Minute in einer Datei angemeldet werden. Wir würden rennen:

$ systemd-run --user --on-calendar '*: 0/1'/bin/sh -c "Datum >> ~/log.TXT "Running Timer als Einheit: Run-r81A4FEF38154401BBD8CDBD1E5C19D04.Timer wird Service als Einheit ausgeführt: Run-r81A4FEF38154401BBD8CDBD1E5C19D04.Service 

Wie wir aus der Ausgabe des Befehls sehen können, wurden zwei temporäre Einheiten erstellt, Run-r81a4FEF38154401BBD8CDBD1E5C19D04.Timer Und Run-r81a4FEF38154401BBD8CDBD1E5C19D04.Service.

Wenn wir die Protokolldatei untersuchen, können wir feststellen, dass der Timer korrekt funktioniert:

$ cat ~/log.txt Mon 20 Jan 2020 11:20:54 Uhr CET MON 20 Jan 2020 11:21:54 CET MON 20 Jan 2020 11:22:54 Uhr CET MON 20 Jan 2020 11:23:54 Uhr : 24: 54 Uhr Cet Mon 20 Jan 2020 11:25:54 Uhr CET Mo 20 Jan 2020 11:26:54 Uhr CET 

Zu entfernen/deaktivieren a Transient Timer, Alles was wir tun müssen, ist es zu stoppen. In diesem Fall würden wir rennen:

US.Timer

Schlussfolgerungen

In diesem Tutorial haben wir gelernt, wie wir Systemaufgaben mithilfe von Systemd -Timern als Alternative zu Cronjobs planen können. Wir haben die grundlegenden Strukturen hinter Timer gesehen, wie wir monotonische und Echtzeitpläne über dedizierte Schlüsselwörter definieren können, wie z Onbootsec oder Oncalendar, So listen und untersuchen Sie aktive Timer, wie sie aktivieren und deaktivieren können.

Schließlich haben wir gesehen, wie man benutzt Transient -Timer. In diesem Artikel sollten Sie alles finden, was Sie benötigen, um mit Timer zu beginnen. Für detailliertere Informationen, die Sie möglicherweise möchten, sehen Sie sich die offizielle Dokumentation entweder online oder durch die Rücksprache mit dem an systemd.Timer Manpage.

Verwandte Linux -Tutorials:

  • Dinge zu installieren auf Ubuntu 20.04
  • Eine Einführung in Linux -Automatisierung, Tools und Techniken
  • Dinge zu tun nach der Installation Ubuntu 20.04 fokale Fossa Linux
  • So erstellen Sie einen Cron -Job in Kubernetes
  • Mint 20: Besser als Ubuntu und Microsoft Windows?
  • Dinge zu tun nach der Installation Ubuntu 22.04 Jammy Quallen…
  • Linux -Download
  • So führen Sie Befehle regelmäßig mit Anacron unter Linux aus
  • Linux -Konfigurationsdateien: Top 30 am wichtigsten
  • Ubuntu 20.04 Tricks und Dinge, die Sie vielleicht nicht wissen