Jobs planen mit at, cron und systemd Timern

LinuxBeginner
Jetzt üben

Einführung

Linux-Administratoren planen Aufgaben auf verschiedene Weise. Der Befehl at plant einmalige Jobs, cron plant wiederkehrende Aufgaben basierend auf einfachen Zeitfeldern, und systemd-Timer planen systemd-Dienste unter Nutzung der Abhängigkeits- und Protokollierungsmodelle von systemd.

In diesem Lab erstellen Sie ein Befehlsskript und planen dessen Ausführung auf drei verschiedene Arten. Sie untersuchen die Scheduler-Dienste, stellen einen einmaligen at-Job in die Warteschlange, konfigurieren eine cron-Drop-in-Datei, erstellen ein Paar aus systemd-Dienst und -Timer und testen den Dienst hinter dem Timer manuell.

Scheduler untersuchen und ein Job-Skript erstellen

In diesem Schritt bestätigen Sie, dass die Scheduler-Dienste ausgeführt werden, und erstellen ein kleines Skript, das von allen geplanten Jobs aufgerufen wird.

Wechseln Sie in das Projektverzeichnis.

cd /home/labex/project

Überprüfen Sie den Daemon für einmalige Jobs und den cron-Daemon. systemctl is-active gibt active aus, wenn ein Dienst aktuell läuft.

systemctl is-active atd crond

Listen Sie die vorhandenen systemd-Timer auf. Die Ausgabe zeigt die nächste Ausführungszeit, die Timer-Unit und die zugehörige Service-Unit, die sie aktiviert.

systemctl list-timers --all --no-pager | sed -n '1,10p'

Erstellen Sie ein Skript, das eine mit einem Zeitstempel versehene Zeile an eine Protokolldatei anhängt. Das erste Argument $1 dient als Kennung, die angibt, welcher Scheduler das Skript ausgeführt hat.

cat > /home/labex/project/scheduled-note.sh <<'EOF'
#!/bin/bash
echo "$(date '+%F %T') $1" >> /home/labex/project/schedule-events.log
EOF

Machen Sie das Skript ausführbar.

chmod 755 /home/labex/project/scheduled-note.sh

Führen Sie das Skript einmal manuell aus.

/home/labex/project/scheduled-note.sh manual-run
tail -n 1 /home/labex/project/schedule-events.log

Die Protokollzeile sollte mit manual-run enden.

Einen einmaligen at-Job in die Warteschlange stellen

In diesem Schritt planen Sie einen einmaligen Job mit at. Dies ist nützlich für Aufgaben, die zu einem späteren Zeitpunkt einmalig ausgeführt werden sollen, wie etwa eine temporäre Wartungsaufgabe.

Stellen Sie das Skript so in die Warteschlange, dass es in zwei Stunden ausgeführt wird. Der auszuführende Befehl wird per Pipe an at übergeben.

echo "/home/labex/project/scheduled-note.sh at-job" | at now + 2 hours

Listen Sie die Jobs in der Warteschlange auf.

atq

Speichern Sie die Job-ID aus der ersten Zeile von atq. Die Job-ID ist das erste Feld in der Ausgabe.

job_id="$(atq | awk 'NR==1 {print $1}')"
echo "$job_id" > /home/labex/project/at-job.id
cat /home/labex/project/at-job.id

Untersuchen Sie den Inhalt des Jobs in der Warteschlange. at -c gibt das generierte Job-Skript aus; die letzten Zeilen sollten den von Ihnen geplanten Befehl enthalten.

at -c "$job_id" | tail -n 12

Eine cron-Drop-in-Datei konfigurieren

In diesem Schritt konfigurieren Sie einen wiederkehrenden cron-Job über eine Datei in /etc/cron.d. Dateien in diesem Verzeichnis enthalten ein Benutzerfeld, sodass das System weiß, unter welchem Account der Befehl ausgeführt werden soll.

Erstellen Sie eine cron-Datei, die das Skript jede Minute als Benutzer labex ausführt. Die PATH-Zeile gibt cron einen definierten Suchpfad für Befehle vor.

sudo tee /etc/cron.d/rhcsa-schedule-demo >/dev/null <<'EOF'
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
* * * * * labex /home/labex/project/scheduled-note.sh cron-job
EOF

Setzen Sie die Dateiberechtigungen auf 644. Cron-Dateien müssen lesbar sein und sollten für normale Benutzer nicht beschreibbar sein.

sudo chmod 644 /etc/cron.d/rhcsa-schedule-demo

Laden Sie crond neu, damit die Datei sofort erkannt wird.

sudo systemctl reload crond

Überprüfen Sie die von Ihnen erstellte Datei.

sudo cat /etc/cron.d/rhcsa-schedule-demo

Die Zeitplanfelder * * * * * bedeuten "jede Minute".

Einen systemd-Dienst und -Timer erstellen

In diesem Schritt erstellen Sie einen systemd-Dienst und einen Timer, der diesen aktiviert. Ein Timer führt einen Befehl nicht direkt aus, sondern startet eine Service-Unit.

Systemdienste sollten Befehle aus Systempfaden ausführen, nicht aus dem Arbeitsverzeichnis eines Benutzers. Installieren Sie eine Kopie Ihres Skripts unter /usr/local/bin.

sudo install -m 755 /home/labex/project/scheduled-note.sh /usr/local/bin/rhcsa-scheduled-note
sudo restorecon /usr/local/bin/rhcsa-scheduled-note 2>/dev/null || true
ls -l /usr/local/bin/rhcsa-scheduled-note

Erstellen Sie die Service-Unit. Type=oneshot ist für einen Befehl geeignet, der ausgeführt wird und sich dann beendet.

sudo tee /etc/systemd/system/rhcsa-schedule-demo.service >/dev/null <<'EOF'
[Unit]
Description=Write RHCSA schedule demo entry

[Service]
Type=oneshot
User=labex
ExecStart=/usr/local/bin/rhcsa-scheduled-note timer-job
EOF

Erstellen Sie die Timer-Unit. OnBootSec=2min plant eine erste Ausführung nach dem Systemstart, und OnUnitActiveSec=5min plant nachfolgende Ausführungen relativ zur vorherigen Aktivierung.

sudo tee /etc/systemd/system/rhcsa-schedule-demo.timer >/dev/null <<'EOF'
[Unit]
Description=Run RHCSA schedule demo periodically

[Timer]
OnBootSec=2min
OnUnitActiveSec=5min
Unit=rhcsa-schedule-demo.service

[Install]
WantedBy=timers.target
EOF

Laden Sie systemd neu, aktivieren Sie den Timer für den Systemstart und starten Sie ihn sofort. Die Trennung von enable und start verdeutlicht, welcher Befehl den Timer dauerhaft macht und welcher ihn sofort aktiviert.

sudo systemctl daemon-reload
sudo systemctl enable rhcsa-schedule-demo.timer
sudo systemctl start rhcsa-schedule-demo.timer

Überprüfen Sie den Timer.

systemctl list-timers rhcsa-schedule-demo.timer --all --no-pager

Der Timer sollte in der Liste erscheinen und rhcsa-schedule-demo.service aktivieren.

Den Timer-Dienst testen und den at-Job entfernen

In diesem Schritt starten Sie den vom Timer verwendeten Dienst manuell. Dies überprüft den Befehl sofort, ohne auf die nächste geplante Timer-Aktivierung zu warten. Sie entfernen außerdem den in die Warteschlange gestellten at-Job, da dieser nur zu Übungszwecken diente.

Starten Sie den Dienst manuell.

sudo systemctl start rhcsa-schedule-demo.service

Überprüfen Sie das Protokoll.

tail -n 5 /home/labex/project/schedule-events.log

Eine Zeile sollte mit timer-job enden.

Entfernen Sie den in die Warteschlange gestellten at-Job mithilfe der zuvor gespeicherten Job-ID.

job_id="$(cat /home/labex/project/at-job.id)"
atrm "$job_id"

Bestätigen Sie, dass der Job nicht mehr in der Warteschlange steht.

atq

Zusammenfassung

Sie haben drei Methoden der Aufgabenplanung geübt. Sie haben atd, crond und systemd-Timer untersucht, ein wiederverwendbares Skript für geplante Befehle erstellt, einen einmaligen at-Job in die Warteschlange gestellt und überprüft, eine wiederkehrende cron-Drop-in-Datei konfiguriert, einen systemkonformen Befehl unter /usr/local/bin installiert, ein Paar aus systemd-Dienst und -Timer erstellt, den Timer-Dienst manuell getestet und den temporären at-Job wieder entfernt.