
Diese Timer können wie Cron-Jobs zu einem bestimmten Zeitpunkt verschiedene Aktionen im System auslösen. Zum Beispiel - AusfĂŒhren von Shell-Skripten oder -Programmen. Timer können beispielsweise einmal am Tag und nur montags arbeiten. Ein weiteres Beispiel ist ein Timer, der wĂ€hrend der GeschĂ€ftszeiten (von 8 bis 18 Uhr) alle 15 Minuten ausgelöst wird. Systemd-Timer können jedoch etwas tun, was Cron-Jobs nicht können. Ein Timer kann beispielsweise ein Skript aufrufen oder eine bestimmte Zeit nach einem Ereignis programmieren. Ein solches Ereignis kann der Systemstart oder der Systemstart, der Abschluss einer vorherigen Aufgabe oder sogar die Beendigung eines Dienstes sein, der zuvor von einem Zeitgeber aufgerufen wurde.
Timer fĂŒr die Systemwartung
Wenn Fedora oder eine andere systembasierte Linux-Distribution auf einem Computer installiert ist, werden im Rahmen der Wartungsroutinen des Systems mehrere Timer erstellt. Diese Verfahren werden automatisch auf jedem Linux-System ausgefĂŒhrt. Die entsprechenden Zeitgeber lösen verschiedene Serviceaufgaben aus, z. B. das Aktualisieren von Systemdatenbanken, das Löschen temporĂ€rer Verzeichnisse, das Drehen von Protokolldateien usw.
Als Beispiel werde ich hier Informationen zu den Timern geben, die auf der virtuellen Maschine verfĂŒgbar sind, die ich fĂŒr Experimente verwendet habe. Um eine Liste aller Timer zu erhalten, habe ich den Befehl verwendet
systemctl status *timer
... Der Sternchen-Platzhalter spielt hier die gleiche Rolle wie bei anderen Àhnlichen Befehlen. Es teilt dem System nÀmlich mit, dass wir an allen Timern (Timer-Einheiten, sie werden auch als "Timer-Einheitendateien" oder "Timer-Einheiten" bezeichnet) von systemd interessiert sind:
[root@testvm1 ~]# systemctl status *timer
â mlocate-updatedb.timer - Updates mlocate database every day
Loaded: loaded (/usr/lib/systemd/system/mlocate-updatedb.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
Trigger: Fri 2020-06-05 00:00:00 EDT; 15h left
Triggers: â mlocate-updatedb.service
Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Updates mlocate database every day.
â logrotate.timer - Daily rotation of log files
Loaded: loaded (/usr/lib/systemd/system/logrotate.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
Trigger: Fri 2020-06-05 00:00:00 EDT; 15h left
Triggers: â logrotate.service
Docs: man:logrotate(8)
man:logrotate.conf(5)
Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Daily rotation of log files.
â sysstat-summary.timer - Generate summary of yesterday's process accounting
Loaded: loaded (/usr/lib/systemd/system/sysstat-summary.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
Trigger: Fri 2020-06-05 00:07:00 EDT; 15h left
Triggers: â sysstat-summary.service
Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Generate summary of yesterday's process accounting.
â fstrim.timer - Discard unused blocks once a week
Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
Trigger: Mon 2020-06-08 00:00:00 EDT; 3 days left
Triggers: â fstrim.service
Docs: man:fstrim
Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Discard unused blocks once a week.
â sysstat-collect.timer - Run system activity accounting tool every 10 minutes
Loaded: loaded (/usr/lib/systemd/system/sysstat-collect.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
Trigger: Thu 2020-06-04 08:50:00 EDT; 41s left
Triggers: â sysstat-collect.service
Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Run system activity accounting tool every 10 minutes.
â dnf-makecache.timer - dnf makecache --timer
Loaded: loaded (/usr/lib/systemd/system/dnf-makecache.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
Trigger: Thu 2020-06-04 08:51:00 EDT; 1min 41s left
Triggers: â dnf-makecache.service
Jun 02 08:02:33 testvm1.both.org systemd[1]: Started dnf makecache âtimer.
â systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories
Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static; vendor preset: disabled)
Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
Trigger: Fri 2020-06-05 08:19:00 EDT; 23h left
Triggers: â systemd-tmpfiles-clean.service
Docs: man:tmpfiles.d(5)
man:systemd-tmpfiles(8)
Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Daily Cleanup of Temporary Directories.
Jedem Timer sind mindestens sechs Zeilen zugeordnet, die Informationen darĂŒber enthalten:
- Die erste Zeile enthÀlt den Namen der Timer-Datei und eine kurze Beschreibung des Zwecks der Existenz des Timers.
- In der zweiten Zeile werden Informationen zum Status des Timers angezeigt. Es wird nÀmlich gemeldet, ob es geladen ist, der vollstÀndige Pfad zur Timer-Datei angegeben und der Status der Hersteller-Voreinstellung (deaktiviert oder aktiviert) angezeigt.
- Die dritte Zeile enthĂ€lt Informationen zur AktivitĂ€t des Timers, einschlieĂlich Informationen darĂŒber, wann der Timer aktiviert wurde.
- Die vierte Zeile enthÀlt das Datum und die Uhrzeit des nÀchsten Starts des Timers sowie die ungefÀhre verbleibende Zeit bis zum Start.
- Die fĂŒnfte Zeile gibt den Namen des vom Timer aufgerufenen Dienstes oder Ereignisses an.
- Einige (aber nicht alle) systemd-Timer-Unit-Dateien enthalten Zeiger auf die Dokumentation. Solche Zeiger finden sich in meinem Beispiel in den Beschreibungen von drei Timern.
- Die letzte Zeile in der Timer-Beschreibung ist der Protokolleintrag, der der letzten vom Timer aufgerufenen Instanz des Dienstes zugeordnet ist.
Wenn Sie versuchen, einen Befehl auf Ihrem Computer auszufĂŒhren
systemctl status *timer
, können sich die ihm prÀsentierten Timer von meinen unterscheiden.
Timer-Erstellung
Obwohl wir die Besonderheiten der Funktionsweise von Timern durch Analyse vorhandener Timer herausfinden könnten, empfehle ich, eine eigene Serviceeinheitendatei (Servicekonfigurationsdatei, Serviceeinheit ) und eine Timerdatei zu erstellen, mit der der entsprechende Service aufgerufen wird. Wir sind hier, um die Geschichte nicht zu komplizieren, geben wir ein eher triviales Beispiel. Aber nachdem wir uns damit befasst haben, wird es fĂŒr Sie einfacher sein, die Arbeit anderer Timer zu verstehen.
Lassen Sie uns zunĂ€chst eine einfache Dienstkonfigurationsdatei erstellen, die so einfach wie ein Befehl ausgefĂŒhrt wird
free
. Dies kann beispielsweise erforderlich sein, wenn die Menge des freien Speichers regelmĂ€Ăig ĂŒberwacht werden muss. Erstellen wir eine Einheitendatei mit dem Namen myMonitor.service
im Ordner /etc/systemd/system
. Es muss nicht ausfĂŒhrbar sein.
# This service unit is for testing timer units
# By David Both
# Licensed under GPL V2
#
[Unit]
Description=Logs system statistics to the systemd journal
Wants=myMonitor.timer
[Service]
Type=oneshot
ExecStart=/usr/bin/free
[Install]
WantedBy=multi-user.target
Diese Datei ist wahrscheinlich die einfachste Dienstkonfigurationsdatei. Lassen Sie uns nun den Status ĂŒberprĂŒfen und testen, um sicherzustellen, dass er wie erwartet funktioniert.
[root@testvm1 system]# systemctl status myMonitor.service
â myMonitor.service - Logs system statistics to the systemd journal
Loaded: loaded (/etc/systemd/system/myMonitor.service; disabled; vendor preset: disabled)
Active: inactive (dead)
[root@testvm1 system]# systemctl start myMonitor.service
[root@testvm1 system]#
Warum wird nichts an die Konsole ausgegeben? Dies liegt daran, dass die Standardausgabe (
stdout
) von Programmen, die von systemd mithilfe von Service Unit-Dateien gestartet wurden , standardmĂ€Ăig in das systemd-Protokoll umgeleitet wird. Aus diesem Grund können diese DatensĂ€tze analysiert werden, solange die entsprechenden DatensĂ€tze vorhanden sind. Werfen wir einen Blick in das Protokoll und suchen nach EintrĂ€gen in Bezug auf unseren Service und den Tag, an dem wir getestet haben. Der entsprechende Befehl sieht folgendermaĂen aus : journalctl -S today -u myMonitor.service
. Der SchlĂŒssel -S
ist eine abgekĂŒrzte Version --since
. Hier können Sie den Zeitraum angeben, fĂŒr den das Dienstprogramm ausgefĂŒhrt wirdjournalctl
auf der Suche nach Aufzeichnungen. Der Punkt ist nicht, dass wir nicht an frĂŒheren Ergebnissen interessiert sind. In unserem Fall werden solche Ergebnisse einfach nicht sein. Dieser SchlĂŒssel wird verwendet, um die Zeit zu verkĂŒrzen, die das Dienstprogramm fĂŒr die Suche nach Daten benötigt. Wenn der Computer lĂ€ngere Zeit funktioniert hat, können sich viele EintrĂ€ge im Protokoll ansammeln.
[root@testvm1 system]# journalctl -S today -u myMonitor.service
-- Logs begin at Mon 2020-06-08 07:47:20 EDT, end at Thu 2020-06-11 09:40:47 EDT. --
Jun 11 09:12:09 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...
Jun 11 09:12:09 testvm1.both.org free[377966]: total used free shared buff/cache available
Jun 11 09:12:09 testvm1.both.org free[377966]: Mem: 12635740 522868 11032860 8016 1080012 11821508
Jun 11 09:12:09 testvm1.both.org free[377966]: Swap: 8388604 0 8388604
Jun 11 09:12:09 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.
[root@testvm1 system]#
Eine Aufgabe, die mithilfe einer Dienstkonfigurationsdatei gestartet wird, kann als einzelnes Programm, als Programmsequenz oder als Skript in einer beliebigen Skriptsprache dargestellt werden. FĂŒgen wir der Einheitendatei eine
myMonitor.service
weitere Aufgabe hinzu, einschlieĂlich der [Service]
folgenden am Ende des Abschnitts :
ExecStart=/usr/bin/lsblk
Lassen Sie uns den Dienst erneut starten und das Protokoll ĂŒberprĂŒfen. Es sollte etwas drin sein, das dem Ă€hnelt, was unten gezeigt wird. Das Protokoll sollte nĂ€mlich die von beiden Befehlen ausgegebenen Daten enthalten:
Jun 11 15:42:18 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...
Jun 11 15:42:18 testvm1.both.org free[379961]: total used free shared buff/cache available
Jun 11 15:42:18 testvm1.both.org free[379961]: Mem: 12635740 531788 11019540 8024 1084412 11812272
Jun 11 15:42:18 testvm1.both.org free[379961]: Swap: 8388604 0 8388604
Jun 11 15:42:18 testvm1.both.org lsblk[379962]: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
Jun 11 15:42:18 testvm1.both.org lsblk[379962]: sda 8:0 0 120G 0 disk
Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ââsda1 8:1 0 4G 0 part /boot
Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ââsda2 8:2 0 116G 0 part
Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ââVG01-root 253:0 0 5G 0 lvm /
Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ââVG01-swap 253:1 0 8G 0 lvm [SWAP]
Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ââVG01-usr 253:2 0 30G 0 lvm /usr
Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ââVG01-tmp 253:3 0 10G 0 lvm /tmp
Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ââVG01-var 253:4 0 20G 0 lvm /var
Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ââVG01-home 253:5 0 10G 0 lvm /home
Jun 11 15:42:18 testvm1.both.org lsblk[379962]: sr0 11:0 1 1024M 0 rom
Jun 11 15:42:18 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.
Jun 11 15:42:18 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal.
Nachdem wir sicher sind, dass alles ordnungsgemÀà funktioniert, erstellen wir im Ordner
/etc/systemd/system
eine Timer-Einheitendatei, die einen Namen erhÀlt myMonitor.timer
. FĂŒgen Sie der Datei Folgendes hinzu:
# This timer unit is for testing
# By David Both
# Licensed under GPL V2
#
[Unit]
Description=Logs some system statistics to the systemd journal
Requires=myMonitor.service
[Timer]
Unit=myMonitor.service
OnCalendar=*-*-* *:*:00
[Install]
WantedBy=timers.target
Der Zeitstempel
OnCalendar
in dieser Datei *-*-* *:*:00
sollte dazu fĂŒhren , dass der Timer das GerĂ€t myMonitor.service
jede Minute anruft. OnCalendar
Wir werden weiter unten mehr darĂŒber sprechen.
In der Zwischenzeit können wir uns die ProtokolleintrĂ€ge zum Starten des Timer-Dienstes ansehen. Wir können auch den Timer-Ăberwachungsmodus aktivieren. Durch die Ăberwachung des Dienstes können Sie die Ergebnisse jedoch nahezu in Echtzeit anzeigen. Dazu mĂŒssen Sie
journalctl
mit dem SchlĂŒssel -f
( follow
) ausfĂŒhren :
[root@testvm1 system]# journalctl -S today -f -u myMonitor.service
-- Logs begin at Mon 2020-06-08 07:47:20 EDT. --
Starten Sie den Timer, nehmen Sie ihn jedoch beim Systemstart nicht in den Autostart auf.
[root@testvm1 ~]# systemctl start myMonitor.timer
[root@testvm1 ~]#
Beobachten Sie, was fĂŒr eine Weile passiert.
Eines der Ergebnisse erscheint sofort. Die nÀchsten werden in AbstÀnden von etwa einer Minute angezeigt. Sehen Sie sich das Magazin einige Minuten lang an.
[root@testvm1 system]# journalctl -S today -f -u myMonitor.service
-- Logs begin at Mon 2020-06-08 07:47:20 EDT. --
Jun 13 08:39:18 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...
Jun 13 08:39:18 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.
Jun 13 08:39:19 testvm1.both.org free[630566]: total used free shared buff/cache available
Jun 13 08:39:19 testvm1.both.org free[630566]: Mem: 12635740 556604 10965516 8036 1113620 11785628
Jun 13 08:39:19 testvm1.both.org free[630566]: Swap: 8388604 0 8388604
Jun 13 08:39:18 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal.
Jun 13 08:39:19 testvm1.both.org lsblk[630567]: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
Jun 13 08:39:19 testvm1.both.org lsblk[630567]: sda 8:0 0 120G 0 disk
Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ââsda1 8:1 0 4G 0 part /boot
Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ââsda2 8:2 0 116G 0 part
Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ââVG01-root 253:0 0 5G 0 lvm /
Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ââVG01-swap 253:1 0 8G 0 lvm [SWAP]
Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ââVG01-usr 253:2 0 30G 0 lvm /usr
Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ââVG01-tmp 253:3 0 10G 0 lvm /tmp
Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ââVG01-var 253:4 0 20G 0 lvm /var
Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ââVG01-home 253:5 0 10G 0 lvm /home
Jun 13 08:39:19 testvm1.both.org lsblk[630567]: sr0 11:0 1 1024M 0 rom
Jun 13 08:40:46 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...
Jun 13 08:40:46 testvm1.both.org free[630572]: total used free shared buff/cache available
Jun 13 08:40:46 testvm1.both.org free[630572]: Mem: 12635740 555228 10966836 8036 1113676 11786996
Jun 13 08:40:46 testvm1.both.org free[630572]: Swap: 8388604 0 8388604
Jun 13 08:40:46 testvm1.both.org lsblk[630574]: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
Jun 13 08:40:46 testvm1.both.org lsblk[630574]: sda 8:0 0 120G 0 disk
Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ââsda1 8:1 0 4G 0 part /boot
Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ââsda2 8:2 0 116G 0 part
Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ââVG01-root 253:0 0 5G 0 lvm /
Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ââVG01-swap 253:1 0 8G 0 lvm [SWAP]
Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ââVG01-usr 253:2 0 30G 0 lvm /usr
Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ââVG01-tmp 253:3 0 10G 0 lvm /tmp
Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ââVG01-var 253:4 0 20G 0 lvm /var
Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ââVG01-home 253:5 0 10G 0 lvm /home
Jun 13 08:40:46 testvm1.both.org lsblk[630574]: sr0 11:0 1 1024M 0 rom
Jun 13 08:40:46 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.
Jun 13 08:40:46 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal.
Jun 13 08:41:46 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...
Jun 13 08:41:46 testvm1.both.org free[630580]: total used free shared buff/cache available
Jun 13 08:41:46 testvm1.both.org free[630580]: Mem: 12635740 553488 10968564 8036 1113688 11788744
Jun 13 08:41:46 testvm1.both.org free[630580]: Swap: 8388604 0 8388604
Jun 13 08:41:47 testvm1.both.org lsblk[630581]: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
Jun 13 08:41:47 testvm1.both.org lsblk[630581]: sda 8:0 0 120G 0 disk
Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ââsda1 8:1 0 4G 0 part /boot
Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ââsda2 8:2 0 116G 0 part
Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ââVG01-root 253:0 0 5G 0 lvm /
Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ââVG01-swap 253:1 0 8G 0 lvm [SWAP]
Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ââVG01-usr 253:2 0 30G 0 lvm /usr
Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ââVG01-tmp 253:3 0 10G 0 lvm /tmp
Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ââVG01-var 253:4 0 20G 0 lvm /var
Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ââVG01-home 253:5 0 10G 0 lvm /home
Jun 13 08:41:47 testvm1.both.org lsblk[630581]: sr0 11:0 1 1024M 0 rom
Jun 13 08:41:47 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.
Jun 13 08:41:47 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal.
ĂberprĂŒfen Sie sowohl den Timer-Status als auch den Servicestatus.
Haben Sie hier bemerkt, was mir aufgefallen ist? Möglicherweise haben Sie beim Lesen der Zeitschrift mindestens zwei Dinge bemerkt.
Erstens - die Tatsache , dass Sie nicht etwas Besonderes zu tun , fĂŒr die Anmeldung mĂŒssen , dass
ExecStart
die myMonitor.service
in schriftlicher Form stdout
. Diese Funktion ist Teil der Standard-Systemd-Startfunktionen. Dies bedeutet jedoch, dass Sie wahrscheinlich vorsichtig sein mĂŒssen, wenn Sie Skripts aus Dienstkonfigurationsdateien ausfĂŒhren und notieren, in wie viele Daten sie schreiben stdout
.
Zweitens haben Sie möglicherweise bemerkt, dass der Timer nicht genau um startet
:00
Sekunden jeder Minute und nicht einmal genau eine Minute nach dem letzten Lauf. Dies ist eine der Funktionen solcher Timer. Wenn dies erforderlich ist (oder wenn dies die GefĂŒhle des Systemadministrators verletzt), kann dieses Verhalten der Timer geĂ€ndert werden, indem sie genauer gemacht werden.
Der Grund dafĂŒr, dass der Timer nicht in
:00
Sekunden jeder Minute startet, liegt darin, dass das System dazu neigt, zu verhindern, dass mehrere Dienste gleichzeitig gestartet werden. Wenn zum Beispiel der Zeitanzeige einrichten, OnCalendar
können Sie Werte wie verwenden Weekly
, Daily
und andere. Diese kurzen Arten der Benennung von Zeiten sind so eingerichtet, dass die Timer, in denen sie verwendet werden, beginnen00:00:00
der entsprechende Tag. Wenn mehrere Timer auf diese Weise konfiguriert werden, ist die Wahrscheinlichkeit hoch, dass alle gleichzeitig ausgelöst werden.
Aus diesem Grund sind systemd-Timer bewusst so konzipiert, dass sie nicht genau zum angegebenen Zeitpunkt starten, sondern mit einer zufĂ€lligen Abweichung davon. Diese Abweichung kann nicht als völlig zufĂ€llig bezeichnet werden. Timer beginnen irgendwo in einem Zeitfenster, das zum angegebenen Zeitpunkt beginnt und eine Minute nach dem Original endet. Diese Zeit wird gemÀà der Dokumentation fĂŒr
systemd.timer
unter BerĂŒcksichtigung aller anderen im System deklarierten Zeitgeber in einem stabilen Zustand gehalten. Im obigen Protokollfragment können Sie sehen, dass der Timer unmittelbar nach dem Start ausgelöst wird und dann - ungefĂ€hr 46 oder 47 Sekunden nach dem Start jeder nĂ€chsten Minute.
Am hĂ€ufigsten passt ein solcher probabilistischer Ansatz zur Bestimmung des genauen Timings der Timer zu jedem. Wenn Sie Aufgaben planen, z. B. eine Sicherungskopie erstellen, wĂ€hrend solche Aufgaben auĂerhalb der GeschĂ€ftszeiten ausgefĂŒhrt werden, verursacht dies keine Probleme. Der Systemadministrator, der Cron-Jobs einrichtet, kann klar definierte Startzeiten festlegen, z. B.
01:05:00
um sicherzustellen, dass diese Jobs nicht mit anderen in Konflikt stehen. Es gibt eine Vielzahl von Möglichkeiten, die Zeit anzugeben, die dies zulĂ€sst. ZufĂ€llige Ănderungen in der Startzeit einer Aufgabe, die eine Minute nicht ĂŒberschreiten, spielen normalerweise keine besondere Rolle.
Bei einigen Aufgaben ist jedoch das genaue Timing des Timers Ă€uĂerst wichtig. In solchen FĂ€llen können Sie beim Einstellen der Timer eine genauere Betriebszeit angeben (bis zu der in Mikrosekunden gemessenen Genauigkeit). Dazu fĂŒgen Sie der Timer-Beschreibungsdatei im Abschnitt
Timer
eine Konstruktion hinzu, die der folgenden Àhnelt:
AccuracySec=1us
Sie können spezielle SchlĂŒsselwörter verwenden, um die gewĂŒnschte Genauigkeit des Timers festzulegen. Diese SchlĂŒsselwörter können auch beim Einrichten von wiederkehrenden und einmaligen Ereignissen verwendet werden. Das System versteht die folgenden SchlĂŒsselwörter:
- Mikrosekunde:
usec
,us
,”s
. - Millisekunde:
msec
,ms
. - Zweitens:
seconds
,second
,sec
,s
. - Minute:
minutes
,minute
,min
,m
. - Stunde:
hours
,hour
,hr
,h
. - Tag:
days
,day
,d
. - Woche:
weeks
,week
,w
. - Monat:
months
,month
,M
(der Monat als 30,44 Tage definiert). - Jahr:
years
,year
,y
(das Jahr als 365,25 Tage definiert ist).
Alle Standard-Timer, die in verfĂŒgbar
/usr/lib/systemd/system
sind, werden mit viel gröĂeren Bereichen konfiguriert, die die Genauigkeit ihrer Auslösung festlegen, da bei diesen Zeitgebern ihre Auslösung zu einem genau festgelegten Zeitpunkt nicht besonders wichtig ist. Schauen Sie sich die technischen Daten einiger vom System generierter Timer an:
[root@testvm1 system]# grep Accur /usr/lib/systemd/system/*timer
/usr/lib/systemd/system/fstrim.timer:AccuracySec=1h
/usr/lib/systemd/system/logrotate.timer:AccuracySec=1h
/usr/lib/systemd/system/logwatch.timer:AccuracySec=12h
/usr/lib/systemd/system/mlocate-updatedb.timer:AccuracySec=24h
/usr/lib/systemd/system/raid-check.timer:AccuracySec=24h
/usr/lib/systemd/system/unbound-anchor.timer:AccuracySec=24h
[root@testvm1 system]#
Um die interne Struktur der Timer-Dateien aus dem Verzeichnis besser zu verstehen
/usr/lib/systemd/system
, können Sie deren Inhalt anzeigen.
Sie mĂŒssen unseren Lern-Timer nicht so konfigurieren, dass er beim Systemstart aktiviert wird. Wenn Sie möchten, können Sie hierfĂŒr den folgenden Befehl verwenden:
[root@testvm1 system]# systemctl enable myMonitor.timer
Die von Ihnen erstellten Timer-Dateien mĂŒssen nicht ausfĂŒhrbar sein. DarĂŒber hinaus mĂŒssen Dienstkonfigurationsdateien nicht so konfiguriert werden, dass sie beim Booten aktiviert werden, da sie von Timern aufgerufen werden. Bei Bedarf kann der Dienst auch manuell ĂŒber die Befehlszeile aufgerufen werden. Versuchen Sie dies und schauen Sie im Systemd-Protokoll nach.
Weitere Informationen zur Genauigkeit von Timern, zum Festlegen des Zeitpunkts der Ereignisauslösung und zum Auslösen von Ereignissen finden Sie in der Dokumentation zu
systemd.timer
und systemd.time
.
Timer-Typen
Systemd-Timer verfĂŒgen ĂŒber andere Funktionen, die Cron-Jobs nicht haben, "einmalig" oder sich wiederholend, die nur mit Echtzeit- und Echtzeitdaten aufgerufen werden. Systemd-Timer können so konfiguriert werden, dass sie basierend auf Ănderungen im Status anderer systemd-Einheiten aufgerufen werden. Beispielsweise kann ein Timer so konfiguriert werden, dass er nach einer bestimmten Zeit nach dem Systemstart, nach der Anmeldung des Benutzers oder nach einer bestimmten Zeit nach dem Aktivieren eines bestimmten Dienstes ausgelöst wird. Diese Timer werden als monoton bezeichnet. Diese Timer werden nach jedem Systemneustart zurĂŒckgesetzt.
Die folgende Tabelle zeigt eine Liste monotoner Timer mit einer kurzen Beschreibung der einzelnen Timer. Es gibt auch eine Beschreibung des Timers.
OnCalendar
Dies ist nicht eintönig und wird in FĂ€llen verwendet, in denen Sie in Zukunft einen einmaligen oder wiederholten Start von etwas organisieren mĂŒssen. Diese Tabelle basiert auf Dokumentation systemd.timer
.
Timer | Monoton | Beschreibung |
|
X. | Die Timer-Betriebszeit wird relativ zum Zeitpunkt der Timer-Aktivierung eingestellt. |
|
X. | Der Timer wird relativ zum Zeitpunkt des Systemstarts eingestellt. |
|
X. | . OnBootSec= , . , , , , , . |
|
X | , , , . |
|
X | , , , . |
|
. systemd.time(7) . OnActiveSec= . â systemd, , cron. |
Beim Einrichten von monotonen Timern können dieselben SchlĂŒsselwörter wie oben beschrieben verwendet werden
AccuracySec
. Es ist jedoch zu beachten, dass systemd die entsprechenden Zeitintervalle in Sekunden umwandelt. Beispielsweise möchten Sie möglicherweise einen Timer festlegen, der fĂŒnf Tage nach dem Systemstart einmal ausgelöst wird. Es könnte wie folgt aussehen : OnBootSec=5d
. Wenn der Computer gebootet wurde 2020-06-15
auf 09:45:27
, wird der Timer startet 2020-06-20
bei 09:45:27
(oder innerhalb von 1 Minute nach diesem Zeitpunkt).
Beschreibung der Kalenderereignisse
Das Anwenden von Kalenderereignissen ist ein wichtiger Bestandteil der Beschreibung von Timern, die in regelmĂ€Ăigen AbstĂ€nden aufgerufen werden. Lassen Sie uns einige der Merkmale solcher Ereignisse untersuchen, die beim Setzen der Zeitanzeige verwendet werden
OnCalendar
.
Systemd und die entsprechenden Timer verwenden ein anderes Zeit- und Datumsformat als crontab. Dieses Format ist flexibler als das in crontab verwendete. Sie können Datum und Uhrzeit auf vereinfachte Weise im Befehlsstil angeben
at
. FĂŒr diejenigen, die damit vertraut sind at
, sollte es leicht sein, die Einstellungen des System-Timers zu verstehen.
Beim
OnCalendar=
Einrichten von Timern wird das folgende Grundformat zum Festlegen von Datum und Uhrzeit verwendet:
DOW YYYY-MM-DD HH:MM:SS
DOW
(Wochentag) ist dies ein optionaler Teil des obigen Konstrukts. In anderen Feldern können Sie das Sternchen ( *
) verwenden , um jeden Wert darzustellen, der an der Position angezeigt wird, die er einnimmt. Alle Formen der Angabe von Datum und Uhrzeit werden in normalisierte Form umgewandelt. Wenn keine Zeit angegeben ist, wird davon ausgegangen 00:00:00
. Wenn das Datum nicht angegeben ist, aber die Uhrzeit angegeben ist, funktioniert der Timer entweder am Tag seines Starts (relativ gesehen "heute") oder am nĂ€chsten Tag ("morgen"). Es hĂ€ngt von der aktuellen Zeit ab. Monate und Wochentage können anhand ihrer Namen benannt werden. Hier können Sie durch Kommas getrennte Wertelisten verwenden. Wertebereiche können durch drei Punkte ( âŠ
) zwischen dem Start- und Endwert des Bereichs getrennt werden.
Bei der Festlegung der Daten stehen uns einige interessante Optionen zur VerfĂŒgung. Somit kann eine Tilde (~) verwendet werden, um den letzten Tag eines Monats oder ein Datum anzugeben, das eine bestimmte Anzahl von Tagen vor dem letzten Tag des Monats liegt. Der SchrĂ€gstrich (/) kann als Modifikator verwendet werden, um den Wochentag anzuzeigen.
Die folgende Tabelle zeigt einige typische Beispiele fĂŒr das in einem Ausdruck verwendete Timing
OnCalendar
.
Beispiel fĂŒr die PrĂ€sentation eines Kalenderereignisses DOW YYYY-MM-DD HH:MM:SS
|
Beschreibung |
|
Jeden Tag eines jeden Monats eines jeden Jahres, 15 Minuten 30 Sekunden nach Mitternacht. |
|
Jeden Montag um 00:00:00 . |
|
Das gleiche wie Weekly . |
|
Das gleiche wie Weekly . |
|
Jeden Mittwoch 2020 um 00:00:00 . |
|
Jeden Wochentag im Jahr 2021 um 00:00:00 . |
|
1. und 15. Juni, Juli und August 2022 01:15:00 nach Mitternacht. |
|
, , , 3 . |
|
, 4 , . |
|
3 , , â , . . , ~ . |
|
, â . . , (- ). |
,
Systemd bietet ein groĂartiges Tool zum ĂberprĂŒfen und ĂberprĂŒfen von Kalenderereignisspezifikationen. Dies ist ein Team
systemd-analyze calendar
, das Beschreibungen von Kalenderereignissen analysiert und in normalisierter Form prÀsentiert. Dieser Befehl enthÀlt auch andere interessante Informationen, z. B. das Datum und die Uhrzeit des nÀchsten solchen Ereignisses sowie die ungefÀhre verbleibende Zeit bis zu diesem Zeitpunkt.
Lassen Sie uns zunĂ€chst einen Blick auf die Spezifikation ĂŒbernehmen, die nur das Datum enthĂ€lt, keine Informationen ĂŒber die Zeit enthalten (beachten Sie, dass die Zeiten in den Feldern
Next elapse
und (in UTC)
unterschiedlich sind, hÀngt dieser Unterschied auf die lokale Zeitzone):
[student@studentvm1 ~]$ systemd-analyze calendar 2030-06-17
Original form: 2030-06-17
Normalized form: 2030-06-17 00:00:00
Next elapse: Mon 2030-06-17 00:00:00 EDT
(in UTC): Mon 2030-06-17 04:00:00 UTC
From now: 10 years 0 months left
[root@testvm1 system]#
FĂŒgen wir nun der Beschreibung Zeitinformationen hinzu. In diesem Beispiel werden Datum und Uhrzeit getrennt als EntitĂ€ten analysiert, die nicht miteinander verbunden sind:
[root@testvm1 system]# systemd-analyze calendar 2030-06-17 15:21:16
Original form: 2030-06-17
Normalized form: 2030-06-17 00:00:00
Next elapse: Mon 2030-06-17 00:00:00 EDT
(in UTC): Mon 2030-06-17 04:00:00 UTC
From now: 10 years 0 months left
Original form: 15:21:16
Normalized form: *-*-* 15:21:16
Next elapse: Mon 2020-06-15 15:21:16 EDT
(in UTC): Mon 2020-06-15 19:21:16 UTC
From now: 3h 55min left
[root@testvm1 system]#
Betrachten Sie nun ein Beispiel, in dem Datum und Uhrzeit zusammen betrachtet werden. Dazu mĂŒssen sie in AnfĂŒhrungszeichen gesetzt werden. Wenn Sie jedoch eine solche Konstruktion verwenden
OnCalendar
, vergessen Sie nicht, die AnfĂŒhrungszeichen zu entfernen, da sonst Fehler auftreten:
[root@testvm1 system]# systemd-analyze calendar "2030-06-17 15:21:16"
Normalized form: 2030-06-17 15:21:16
Next elapse: Mon 2030-06-17 15:21:16 EDT
(in UTC): Mon 2030-06-17 19:21:16 UTC
From now: 10 years 0 months left
[root@testvm1 system]#
Lassen Sie uns nun etwas aus der vorherigen Tabelle ĂŒberprĂŒfen. Diese Beschreibung von ihr gefĂ€llt mir besonders gut:
2022-6,7,8-1,15 01:15:00
Lassen Sie es uns analysieren:
[root@testvm1 system]# systemd-analyze calendar "2022-6,7,8-1,15 01:15:00"
Original form: 2022-6,7,8-1,15 01:15:00
Normalized form: 2022-06,07,08-01,15 01:15:00
Next elapse: Wed 2022-06-01 01:15:00 EDT
(in UTC): Wed 2022-06-01 05:15:00 UTC
From now: 1 years 11 months left
[root@testvm1 system]#
Schauen
Mon *-05~3
wir uns nun die Beschreibung an , aber dieses Mal werden wir das Programm um Informationen ĂŒber die nĂ€chsten fĂŒnf Male des Timers bitten, der die folgenden Einstellungen verwendet:
[root@testvm1 ~]# systemd-analyze calendar --iterations=5 "Mon *-05~3"
Original form: Mon *-05~3
Normalized form: Mon *-05~03 00:00:00
Next elapse: Mon 2023-05-29 00:00:00 EDT
(in UTC): Mon 2023-05-29 04:00:00 UTC
From now: 2 years 11 months left
Iter. #2: Mon 2028-05-29 00:00:00 EDT
(in UTC): Mon 2028-05-29 04:00:00 UTC
From now: 7 years 11 months left
Iter. #3: Mon 2034-05-29 00:00:00 EDT
(in UTC): Mon 2034-05-29 04:00:00 UTC
From now: 13 years 11 months left
Iter. #4: Mon 2045-05-29 00:00:00 EDT
(in UTC): Mon 2045-05-29 04:00:00 UTC
From now: 24 years 11 months left
Iter. #5: Mon 2051-05-29 00:00:00 EDT
(in UTC): Mon 2051-05-29 04:00:00 UTC
From now: 30 years 11 months left
[root@testvm1 ~]#
Ich glaube, wir haben genug AnwendungsfÀlle behandelt
systemd-analyze calendar
, damit Sie Ihre eigenen Kalenderereignisbeschreibungen testen können. Beachten Sie, dass das Tool systemd-analyze
weitere interessante Funktionen bietet.
ZusÀtzliche Materialien
Es gibt viele Veröffentlichungen zu systemd im Internet, aber sie sind meistens zu kurz, sehr simpel oder sogar fehlerhaft. Dieser Artikel enthÀlt einige gute Informationsquellen zu systemd. Unten finden Sie eine Liste mit Links zu weiteren hochwertigen Materialien zu diesem Thema.
- Eine praktische Anleitung zum System des Fedora-Projekts.
- Ein Spickzettel aus dem Fedora-Projekt, der die alten SystemV- und systemd-Befehle abbildet.
- Details zu systemd und warum es erstellt wurde.
- Eine Ressource mit Informationen und RatschlÀgen zu systemd.
- (Lennart Poettering), systemd. , 2010 2011, . systemd .
- systemd.
- systemd.
Systemd-Timer können verwendet werden, um dieselben Aufgaben wie Cron-Jobs auszufĂŒhren. Systemd bietet Ihnen jedoch mehr FlexibilitĂ€t bei der Konfiguration von Kalender- und monotonen Timern.
Obwohl die Dienstkonfigurationsdateien, die wir wÀhrend unserer Experimente erstellen, normalerweise mit Timern aufgerufen werden, können Sie sie jederzeit mit einem Befehl wie aufrufen
systemctl start myMonitor.service
. Ein Timer kann mehrere Aufgaben starten. Dies können beispielsweise Bash-Skripte und Linux-Dienstprogramme sein. Eine Dienstkonfigurationsdatei kann so zusammengestellt werden, dass beim Aufruf mehrere Skripts ausgefĂŒhrt werden. Sie können die Skripte auch separat ausfĂŒhren lassen.
Wenn wir ĂŒber die Koexistenz von systemd, cron und at sprechen, möchte ich darauf hinweisen, dass ich noch keine Anzeichen dafĂŒr gesehen habe, dass cron oder at veraltet wĂ€ren. Ich hoffe, dass sie weiterhin unterstĂŒtzt werden, da es zumindest viel einfacher als systemd ist, einmalige Aufgaben zu planen.
Was benutzt du? Systemd Timer oder Cron Jobs?
