Hinweis:

Systemzeit- und Zeitplanaufgaben in Oracle Linux verwalten

Einführung

Oracle Linux bietet Benutzern verschiedene Möglichkeiten, mit Uhrzeit und Datum zu interagieren. Sie können diese manuell ändern. In der Regel wird jedoch ein Service konfiguriert, der das Network Time Protocol (NTP) implementiert, wie chrony. Auf diese Weise bleibt die Systemzeit korrekt, und alle Aufgaben, die cron oder systemd timers verwenden, werden planmäßig ausgeführt.

Ziele

In diesem Tutorial lernen Sie:

Voraussetzungen

Oracle Linux bereitstellen

Hinweis: Wenn Sie in Ihrem eigenen Mandanten ausgeführt werden, lesen Sie das Projekt linux-virt-labs GitHub README.md, und schließen Sie die Voraussetzungen ab, bevor Sie die Übungsumgebung bereitstellen.

  1. Öffnen Sie ein Terminal auf dem Luna Desktop.

  2. Klonen Sie das Projekt linux-virt-labs GitHub.

    git clone https://github.com/oracle-devrel/linux-virt-labs.git
    
  3. Wechseln Sie in das Arbeitsverzeichnis.

    cd linux-virt-labs/ol
    
  4. Installieren Sie die erforderlichen Sammlungen.

    ansible-galaxy collection install -r requirements.yml
    
  5. Bereitstellen der Übungsumgebung.

    ansible-playbook create_instance.yml -e localhost_python_interpreter="/usr/bin/python3.6"
    

    Die kostenlose Übungsumgebung erfordert die zusätzliche Variable local_python_interpreter, die ansible_python_interpreter für Wiedergaben festlegt, die auf localhost ausgeführt werden. Diese Variable ist erforderlich, da die Umgebung das RPM-Package für das Oracle Cloud Infrastructure-SDK für Python unter den python3.6-Modulen installiert.

    Die Standard-Deployment-Ausprägung verwendet AMD-CPU und Oracle Linux 8. Um eine Intel CPU oder Oracle Linux 9 zu verwenden, fügen Sie dem Deployment-Befehl -e instance_shape="VM.Standard3.Flex" oder -e os_version="9" hinzu.

    Wichtig: Warten Sie, bis das Playbook erfolgreich ausgeführt wird, und erreichen Sie die Unterbrechungsaufgabe. In dieser Phase des Playbooks ist die Installation von Oracle Linux abgeschlossen, und die Instanzen sind bereit. Notieren Sie sich die vorherige Wiedergabe, in der die öffentlichen und privaten IP-Adressen der bereitgestellten Knoten und alle anderen Deployment-Informationen gedruckt werden, die während der Ausführung der Übung erforderlich sind.

Systemdatum und -zeit konfigurieren

Oracle Linux verfügt über drei allgemeine Befehle, mit denen Sie Datum und Uhrzeit auf Ihrem System anpassen können. Der Befehl date passt die Systemzeit an, während hwclock die RTC-Zeit anpasst. In Oracle Linux bezieht sich die RTC-Zeit auf die Zeit, die von der Real-Time Clock (RTC) aufbewahrt wird, einer batteriegestützten Hardwareuhr, die weiter ausgeführt wird, wenn das System ausgeschaltet ist. Andere gebräuchliche Namen für die Hardwareuhr sind die CMOS-Uhr oder die BIOS-Uhr. Wenn Sie die RTC-Uhr nach einer date-Änderung aktualisieren möchten, müssen Sie hwclock ausführen.

Die dritte Option ist timedatectl. Dieser Befehl kombiniert date und hwclock und aktualisiert sowohl das System als auch die RTC beim Festlegen der Uhrzeit. Bei modernen systemdbasierten Linux-Distributionen wie Oracle Linux wird empfohlen, timedatectl zu verwenden.

Systemuhr anzeigen und einstellen

  1. Öffnen Sie ein Terminal, und verbinden Sie sich über SSH mit der Instanz ol-node-01.

    ssh oracle@<ip_address_of_instance>
    
  2. Aktuelle Systemzeit und -datum abrufen.

    date
    

    Die Ausgabe zeigt Datum, Uhrzeit und Zeitzone des Systems im Standardformat an. Sie können das Format der Ausgabe mit den vielen Argumenten des Befehls date ändern. Diese Argumente helfen beim Skripten oder Berechnen verschiedener Datums- und Uhrzeitangaben. Weitere Informationen finden Sie, indem Sie date --help ausführen oder die manuelle Seite mit man date anzeigen.

  3. Systemzeit und -datum anpassen

    sudo date -s "1 JAN 1970 16:00:00"
    
  4. Vereinfachen Sie das Format mit den Formatkontrollargumenten.

    sudo date +%Y%m%d -s "20250203"
    

    Da Sie keine Uhrzeit angegeben haben, wird der Zeitabschnitt standardmäßig auf Nullen gesetzt, d.h. auf Mitternacht.

  5. Legen Sie die Systemzeit fest.

    sudo date +%T -s "14:08:14"
    

    Wenn Sie den Befehl date erneut ausführen, sollte die Zeit entsprechend Ihrer Eingabe angezeigt werden.

Hardwareuhr anzeigen und einstellen

  1. Lesen Sie die aktuelle Hardware-Uhr (RTC).

    sudo hwclock --show
    
  2. Legen Sie die Systemuhr basierend auf der Hardwareuhr fest.

    sudo hwclock -s
    

    Mit dem Befehl können Sie die Uhren in die entgegengesetzte Richtung setzen, indem Sie die Funktion -w übergeben. Sehen Sie sich zusätzliche Funktionen und Optionen an, indem Sie hwclock --help ausführen oder die manuelle Seite man hwclock anzeigen.

Datum und Uhrzeit mit Systemd

  1. Aktuelles Datum und aktuelle Zeit abrufen.

    timedatectl
    

    Die Ausgabe in der kostenlosen Übungsumgebung zeigt, dass der NTP-Service aktiv ist. Um die Datums- und Uhrzeiteinstellungen manuell mit timedatectl anzupassen, muss dies zuerst deaktiviert werden.

  2. Deaktivieren Sie die NTP-Synchronisierung.

    sudo timedatectl set-ntp no
    
  3. Legen Sie Datum und Zeit fest.

    sudo timedatectl set-time '2014-09-23 14:10:40'
    
  4. Prüfen Sie Datum und Uhrzeit.

    date
    
  5. Eine Liste der Zeitzonen abrufen.

    timedatectl list-timezones
    

    Drücken Sie q, um den timedatectl-Befehl zu beenden.

  6. die Zeitzone festlegen.

    sudo timedatectl set-timezone 'America/Chicago'
    
  7. Prüfen Sie die neue Zeitzone.

    timedatectl
    
  8. Geben Sie die Zeitzone an Coordinated Universal Time (UTC) zurück.

    sudo timedatectl set-timezone 'UTC'
    
  9. Aktivieren Sie die NTP-Synchronisierung.

    sudo timedatectl set-ntp yes
    

    Nach einiger Zeit erfolgt die Synchronisierung, und die Uhr wird basierend auf der festgelegten Zeitzone zum aktuellen Tag und zur aktuellen Uhrzeit zurückkehren.

Chrony verwenden

chrony ist ein Feature von Oracle Linux, das NTP implementiert, um die Zeiterfassung im Netzwerk genau aufrechtzuerhalten. Es besteht aus zwei Komponenten, chronyd und chronyc. chronyd ist ein Service-Daemon, der beim Booten aktiviert und gestartet werden kann, während chronyc ein Befehlszeilenutility ist, mit dem die Performance von chronyd überwacht und die Laufzeitparameter geändert werden.

  1. Prüfen Sie, ob chrony installiert ist.

    dnf list chrony
    

    Sie können es mit sudo dnf install -y chrony installieren, wenn Sie feststellen, dass es nicht installiert ist.

  2. Prüfen Sie den Status des Service-Daemons.

    sudo systemctl status chronyd
    

    Aktivieren und starten Sie den Service mit sudo systemctl enable --now chronyd, wenn er inaktiv ist. Drücken Sie q, um den systemctl-Befehl zu beenden.

  3. Informationen zur Leistung der Systemuhr abrufen.

    chronyc -n tracking
    

    Beispielausgabe:

    Reference ID    : A9FEA9FE (169.254.169.254)
    Stratum         : 3
    Ref time (UTC)  : Mon Feb 03 16:07:59 2025
    System time     : 0.000009410 seconds slow of NTP time
    Last offset     : -0.000011537 seconds
    RMS offset      : 0.000015202 seconds
    Frequency       : 22.818 ppm slow
    Residual freq   : -0.004 ppm
    Skew            : 0.222 ppm
    Root delay      : 0.000643811 seconds
    Root dispersion : 0.000107666 seconds
    Update interval : 64.4 seconds
    Leap status     : Normal
    

    Dabei gilt:

    • Referenz-ID: Dies ist die Referenz-ID und der Name oder die IP-Adresse des Servers, mit dem der Computer derzeit synchronisiert ist. Die Referenz-ID in der Ausgabe wird als Hexadezimalzahl angezeigt.
    • Stratum: Das Stratum gibt an, wie viele Hopfen von einem Computer mit angeschlossener Referenzuhr entfernt sind.
    • Ref-Zeit: Dies ist die Zeit in UTC, zu der das System die letzte Messung aus der Referenzquelle verarbeitet hat.

    Weitere Informationen finden Sie in der Anleitung unter man chronyc.

  4. Rufen Sie eine Liste der Quellen ab, die Ihr System verwendet.

    chronyc -n sources
    

    Mit der Option -v werden Spaltenbeschreibungen für jede der angezeigten Spalten angezeigt.

Aufgaben planen

Oracle Linux bietet verschiedene Möglichkeiten, Aufgaben zu planen. Diese Aufgaben oder Jobs können auf System- oder Benutzerebene ausgeführt werden. Während cron wahrscheinlich die bekannteste dieser Methoden ist, führte systemd die flexibleren Timer in Bezug auf die Planung mit dem Kalender und der monotonen Zeit ein und wird immer häufiger verwendet. Aktuelle Oracle Linux-Distributionen haben eine Kombination aus beidem.

Cron verwenden

  1. Auf Cron-Jobs auf Systemebene prüfen.

    sudo ls -al /etc/cron*
    

    Die Ausgabe enthält mehrere Verzeichnisse mit ausführbaren Skripten, die ausgewählte Aufgaben nach einem vordefinierten Zeitplan ausführen, z.B. stündlich, wöchentlich und monatlich. Das Verzeichnis /etc/cron.d ist ebenfalls vorhanden, in dem Packages crontab-Snippets platzieren können, ohne das System /etc/crontab zu ändern.

  2. Rufen Sie eine Liste der Cron-Jobs auf Systemebene ab.

    sudo crontab -l
    

    Die Ausgabe gibt an, dass keine crontab-Datei für root vorhanden ist. Wenn Sie denselben Befehl ohne sudo ausführen, wird dieselbe Ausgabe angezeigt, jedoch für das lokale Benutzerkonto.

  3. Cron-Job auf Benutzerebene erstellen

    (crontab -l 2>/dev/null; echo  '* * * * * date >> /home/oracle/test') | crontab -
    

    Der erste Befehl vermeidet die Meldung no crontab, da dies der erste eingegebene Job ist, und der zweite Job erstellt den Job, der jede Minute ausgeführt wird.

  4. Überprüfen Sie, ob crontab jetzt vorhanden ist.

    crontab -l
    

    Jeder Job wird in seiner eigenen Zeile im crontab angezeigt. Die crontab-Datei enthält fünf durch Leerzeichen getrennte Felder, in denen die verschiedenen Zeiträume definiert werden, die Sie konfigurieren können, gefolgt von dem Befehl, den der Job ausführen wird. Der Befehl kann jedem Befehl entsprechen, den Sie in der Befehlszeile des Systems ausführen können. So können Sie Ihre Skripte ausführen oder Pipes und Umleitungsoperatoren nutzen. Wenn Sie den Job bearbeiten möchten, verwenden Sie den Befehl crontab -e, mit dem Sie in den Standard-EDITOR vi unter Oracle Linux gelöscht werden.

    Optionen für Crontab-Zeitfolge

    Crontab definiert Zeitfelder wie folgt:

    • Minute: Von 0 bis 59
    • Stunde: Von 0 bis 23
    • Tag: Von 1 bis 31
    • Monat: Von 1 bis 12, oder der Name des Monats
    • Wochentag: Von 0 bis 7 oder der abgekürzte Name des Tages. 0 und 7 repräsentieren den Sonntag.

    Sie können Sonderzeichen in einem der Zeitfelder verwenden:

    • Sternchen (*): Gibt an, dass der Befehl für jede Instanz des Feldes ausgeführt werden soll.
    • Bindestrich (-): Kann zur Angabe eines Bereichs verwendet werden. Beispiel: Im Feld "Wochentag" können Sie 1-5 angeben, um die Ausführung der Aufgabe von Montag bis Freitag zu planen, jedoch nicht am Samstag oder Sonntag.
    • Komma (,): Kann verwendet werden, um eine Werteliste für ein Feld anzugeben. Beispiel: Im Stundenfeld können Sie 6,18 angeben, um die Ausführung der Aufgabe um 6 Uhr und 6 Uhr zu planen.
    • Schrägstrich (/): Damit können Sie Schrittwerte angeben. Beispiel: Sie können im Feld "Minuten" */15 angeben, um die Ausführung einer Aufgabe alle 15 Minuten zu planen.

    Mit dem crontab können Sie auch eine eindeutige Kurzzeiterweiterung verwenden, um die Zeitfelder für allgemeine Zeitanforderungen zu ersetzen. Wichtig ist, dass diese Kurzform auch eine Option zum Ausführen eines Befehls nach dem Neustart enthält:

    • @reboot: Einmal nach dem Neustart ausführen.
    • @yearly : Einmal im Jahr ausführen, d.h. "0 0 1 1 *".
    • @annually : Einmal im Jahr ausführen, d.h. "0 0 1 1 *".
    • @monthly : Einmal im Monat ausführen, d.h. "0 0 1 * *".
    • @weekly : Einmal pro Woche ausführen, d.h. "0 0 * * 0".
    • @daily : Einmal täglich ausführen, d.h. "0 0 * * *".
    • @hourly : Einmal pro Stunde ausführen, d.h. "0 * * * *".

    Der Crontab bietet nur eine Granularität von 1 Minute. Wenn Sie eine feinere granulare Steuerung Ihrer Aufgabe benötigen, wird empfohlen, systemd Timer zu verwenden.

    Beispiele:

    */15 * * * * echo "This crontab entry runs every 15 minutes"
    10 * * * * echo "This crontab entry runs at 10 minutes past every hour"
    30 13 * * 3 echo "This crontab entry runs at 13h30 on every Wednesday"
    @reboot echo "This command runs once after a reboot event"
    
  5. Überprüfen Sie die Cron-Ausgabe.

    sudo tail /var/log/cron
    

    In der Ausgabe werden Datum, Uhrzeit, Benutzer und Befehl angezeigt. Da eine minimale Standardinstallation von Oracle Linux den Mail Transport Agent (MTA) nicht installiert, leitet der cron-Daemon die Ausgabe von Befehlen, die in der crontab-Datei angegeben sind, an den Syslog-Daemon weiter. Daher können Sie die crontab-Ausgabe in der Logdatei unter /var/log/cron anzeigen.

    Crontab-Befehlssyntax

    Die crontab-Datei wird unter den Zugangsdaten des Benutzers ausgeführt, zu dem die crontab-Datei gehört, und wird mit einigen festgelegten Standardumgebungsvariablen ausgeführt, darunter:

    • HOME: Das HOME-Verzeichnis für den Benutzer, als der crontab ausgeführt wird
    • LOGNAME: Entspricht dem Benutzernamen des Benutzers, als der crontab ausgeführt wird
    • BENUTZER: Der Benutzername des Benutzers, als der crontab ausgeführt wird
    • SHELL: Die SHELL-Binärdatei, mit der das System Befehle ausführt. Dieser Wert ist standardmäßig auf /bin/sh gesetzt.
    • PATH: Der Pfad, der für das crontab-Utility verfügbar ist. Dieser Wert ist standardmäßig auf /usr/bin:/bin gesetzt.

    Sie können alternative Umgebungsvariablen festlegen, indem Sie sie als Zeilen innerhalb der crontab-Datei angeben, die keine Zeitfelder enthalten. Beispiel: Wenn Sie die bash-Shell verwenden möchten und regelmäßig alle Variablen und Einstellungen in Ihrer persönlichen .bashrc-Konfiguration importieren möchten, können Sie das Crontab mit crontab -e wie folgt bearbeiten:

    SHELL=/bin/bash
    * * * * * source $HOME/.bashrc;
    

    Da der Befehl crontab-Jobs in einer Shell-Umgebung ausgeführt wird, gilt die Standard-Shell-Syntax und kann zum Überleiten oder Umleiten der Ausgabe verwendet werden. Beispiel: Um alle Ausgaben in /dev/null umzuleiten, verwenden Sie Standard-Shell-Umleitungen für die STDOUT- und STDERR-Ausgabe im Befehl:

    * * * * * /path/to/command > /dev/null 2>&1
    

    Alternativ können Sie die Ausgabe umleiten, um sie an eine Datei anzuhängen, mit der Sie die Ausgabe bei jeder Ausführung des Befehls verfolgen können:

    * * * * * /path/to/command >> $HOME/command.log
    

    Beispiele:

    */15 * * * * echo "This 'silent' crontab entry runs every 15 minutes but the output is redirected to /dev/null" > /dev/null 2>&1
    * * * * * echo "The date and time is $(date +\%Y-\%m-\%d\ \%H:\%M:\%S)" >> $HOME/crontab.log
    

    Im Beispiel werden die %-Zeichen im date-Befehl maskiert, da %-Zeichen vom crontab-Utility in Zeilenvorschubzeichen geändert werden und alle Daten nach dem ersten % als Standardeingabe an den Befehl gesendet werden. Weitere Informationen finden Sie unter man 5 crontab.

Crontab-Datei entfernen

Wenn Sie nur einen bestimmten Job entfernen möchten, können Sie die einzelne Zeile, die diesen Job enthält, mit dem Befehl crontab -e bearbeiten und entfernen. Wenn Sie jedoch alle Jobs entfernen möchten, bietet crontab eine schnelle und effiziente Option.

  1. Entfernen Sie alle Ihre Cron-Jobs.

    crontab -r
    

Systemtimer

Wie Cron-Jobs ermöglichen Systemd-Timer das Ausführen von Befehlen oder Skripten zu einem bestimmten Zeitpunkt. Diese Aufgaben werden jedoch von systemd gesteuert und überwacht und haben eine feinere Kontrolle über die zeitbasierte Aktivierung.

  1. Vorhandene Timer auflisten.

    systemctl status *timer
    

    Drücken Sie q, um den systemctl-Befehl zu beenden.

Timer erstellen

Ein Timer besteht aus einer Serviceeinheit, die die zu erledigende Arbeit definiert, und einer Timereinheit, um sie zu planen und auszulösen. Da es sich um systemgesteuerte Serviceeinheiten handelt, können Sie diese im System oder im Benutzerbereich erstellen. Der Vorteil des Benutzerbereichs besteht darin, dass Benutzer ihre Services wie Daemons und automatisierte Aufgaben verwalten können.

  1. Erstellen Sie das systemd-Verzeichnis des lokalen Benutzers.

    mkdir -p ~/.config/systemd/user
    

    Serviceeinheiten und Timer auf Systemebene gehen in /etc/systemd/system.

  2. Aktivieren Sie Lingering für den aktuellen Benutzer.

    loginctl enable-linger $(whoami)
    

    Lingering bezieht sich auf eine Funktion in systemd, mit der Benutzerprozesse auch dann weiter ausgeführt werden können, wenn sich der Benutzer von seiner Sitzung abmeldet.

  3. Überprüfen Sie den Aufenthaltsstatus des Benutzers.

    loginctl user-status $(whoami)
    

    Drücken Sie q, um den loginctl-Befehl zu beenden.

  4. Schreiben Sie ein Skript, damit der Timer ausgeführt wird.

    cat << 'EOF' | tee ~/test.sh > /dev/null 
    #!/bin/bash
    /usr/bin/echo "test from test.service: $(date)" 2>&1 | tee -a /home/oracle/test.log
    EOF
    
  5. Machen Sie das Skript ausführbar.

    chmod +x ~/test.sh
    
  6. Erstellen Sie eine Serviceeinheit.

    cat << EOF | tee ~/.config/systemd/user/test.service > /dev/null
    [Unit]
    Description=Run the test script
    StartLimitIntervalSec=1
    StartLimitBurst=10
       
    [Service]
    Type=oneshot
    ExecStart=/home/oracle/test.sh
    StandardOutput=journal
    SyslogIdentifier=test
    EOF
    

    Der Service erfordert StartLimitIntervalSec und StartLimitBurst, da er diesen Service alle paar Sekunden ausführen soll. Weitere Informationen zu diesen Parametern finden Sie unter man systemd.unit.

  7. Erstellen Sie eine Timer-Einheit.

    cat << EOF | tee ~/.config/systemd/user/test.timer > /dev/null
    [Unit]
    Description=Run test.service every 10 seconds
    
    [Timer]
    OnCalendar=*:*:0/10
    AccuracySec=1
    Persistent=true
    
    [Install]
    WantedBy=timers.target
    EOF
    

    Der Parameter AccuracySec ist erforderlich, da systemd Timer nicht genau ausgeführt werden, wenn sie angefordert werden, sondern mit einer Standardabweichung von einer Minute arbeiten.

  8. Informieren Sie systemd über die Änderungen.

    systemctl --user daemon-reload
    
  9. Aktivieren und starten Sie den Timer.

    systemctl --user enable --now test.timer
    
  10. Prüfen Sie, ob der Timer ausgeführt wird.

    systemctl --user status test.timer --no-pager
    

    Mit der Option --no-pager wird die vollständige Ausgabe gedruckt, ohne dass Sie durch die Einträge scrollen oder blättern müssen. Weitere Optionen finden Sie unter systemctl --help.

  11. Prüfen Sie die Logdatei des bash-Skripts.

    cat ~/test.log
    
  12. Prüfen Sie das systemd-Journal.

    journalctl -r -n 10 --user-unit test --no-pager
    

    Diese Ausgabe zeigt die letzten 10 Zeilen der Ausgabe der systemd unit des Benutzers test.service an. Mit der Option -r werden die Buchungen in umgekehrter chronologischer Reihenfolge angezeigt.

    journalctl -r -n 10 -t test --no-pager
    

    Dieser Befehl zeigt die Ausgabe an, die vom Skript generiert wird, das von der systemd-Serviceeinheit ausgeführt wird. Die Option -t entspricht der in der Datei test.service definierten SyslogIdentifier, die eine ID für die Suche bereitstellt. Weitere Optionen für journalctl finden Sie auf der Seite man journalctl.

  13. Timer deaktivieren

    systemctl --user disable test.timer
    

    Dieser Befehl verhindert, dass der Timer in Zukunft automatisch gestartet wird, und macht ihn inaktiv.

  14. Stoppen Sie den Timer.

    systemctl --user stop test.timer
    

    Dieser Befehl stoppt die aktuelle Ausführung des Timers, wenn er ausgeführt wird. Es verhindert nicht, dass der Timer in Zukunft wieder startet.

Nächste Schritte

Nach Abschluss dieses Tutorials haben Sie Ihre Fähigkeiten und Fähigkeiten zur Verwaltung von Datum, Uhrzeit und Zeitplanaufgaben für Oracle Linux demonstriert. Es gibt viele weitere Flags und Funktionen der angezeigten Befehle. Sehen Sie sich die Links unten und die vorgeschlagenen Manpages an, um Ihr Wissen und Ihre Fähigkeiten zu erweitern.

Weitere Lernressourcen

Sehen Sie sich weitere Übungen zu docs.oracle.com/learn an, oder greifen Sie auf weitere kostenlose Lerninhalte im Oracle Learning YouTube-Kanal zu. Besuchen Sie außerdem education.oracle.com/learning-explorer, um ein Oracle Learning Explorer zu werden.

Die Produktdokumentation finden Sie im Oracle Help Center.