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.



