Tutorial

So automatisieren Sie Aufgaben mit Cron unter CentOS 8

CentOSSystem ToolsCentOS 8

Eine frühere Version dieses Tutorials wurde von Shaun Lewis geschrieben.

Einführung

Cron ist ein zeitbasierter Daemon für die Feinterminierung, der in Unix-ähnlichen Betriebssystemen gefunden wird, einschließlich Linux-Distributionen. Cron wird im Hintergrund ausgeführt. Aufgaben, die mit Cron geplant werden, heißen „Cron-Aufträge“ und werden automatisch ausgeführt. Daher ist Cron nützlich für die Automatisierung von wartungsbezogenen Aufgaben.

Dieser Leitfaden bietet einen Überblick über die Planung von Aufgaben mit Crons spezieller Syntax. Überdies erklärt er einige Kurzbefehle, mit deren Hilfe man das Planen von Aufträgen leichter schreiben und verstehen kann.

Voraussetzungen

Um diesen Leitfaden zu absolvieren, benötigen Sie Zugriff auf einen Computer, der CentOS 8 ausführt. Das könnte Ihr lokaler Rechner, ein virtueller Rechner oder ein virtueller privater Server sein.

Egal, welchen Computer Sie für diesen Leitfaden benutzen – er sollte einen Benutzer ohne Rootberechtigung mit konfigurierten Administratorberechtigungen haben. Folgen Sie zur Einrichtung unserem Leitfaden zur Ersteinrichtung des Servers für CentOS 8.

Installation von Cron

Bei fast jeder Linux-Distribution ist Cron auf irgendeine Weise standardmäßig installiert. Wenn Sie jedoch einen CentOS-Rechner verwenden, auf dem Cron nicht installiert ist, können Sie es mit dnf installieren.

Um Cron auf einem CentOS-Rechner zu installieren, aktualisieren Sie zuerst den lokalen Paketindex des Computers.

  • sudo dnf update

Installieren Sie dann den Cron-Daemon mit dem folgenden Befehl:

  • sudo dnf install crontabs

Dieser Befehl fordert Sie auf, zu bestätigen, dass Sie das Paket crontabs und seine Abhängigkeiten installieren möchten. Bestätigen Sie, indem Sie y und dann die EINGABETASTE drücken.

Dadurch wird Cron auf Ihrem System installiert, aber den Daemon müssen Sie manuell starten. Außerdem müssen Sie sicherstellen, dass eine Ausführung bei jedem Server-Boot festgelegt ist. Sie können beide Aktionen mit dem Befehl systemctl ausführen.

Um den Cron-Daemon zu starten, führen Sie folgenden Befehl aus:

  • sudo systemctl start crond.service

Um einzustellen, dass Cron bei jedem Start des Servers ausgeführt wird, geben Sie Folgendes ein:

  • sudo systemctl enable crond.service

Danach wird Cron auf Ihrem System installiert und Sie können mit der Planung von Aufträgen beginnen.

So funktioniert Cron

Cron-Jobs werden aufgezeichnet und in einer speziellen Datei namens crontab verwaltet. Jedes Benutzerprofil im System kann über ein eigenes crontab verfügen, bei dem Aufträge geplant werden können. Das ist unter /var/spool/cron/ gespeichert.

Um einen Auftrag zu planen, müssen Sie nur Ihr crontab für die Bearbeitung öffnen und eine Aufgabe hinzufügen, die in Form eines Cron-Ausdrucks geschrieben wird. Die Syntax für Cron-Ausdrücke kann in zwei Elemente unterteilt werden: die Planung und der Befehl zur Ausführung.

Der Befehl kann praktisch jeder Befehl sein, den Sie normalerweise auf der Befehlszeile ausführen würden. Die Planungs-Komponente der Syntax besteht aus 5 verschiedenen Feldern, die in folgender Reihenfolge geschrieben werden:

Feld Zulässige Werte
Minute 0–59
Stunde 0-23
Tag des Monats 1-31
Monat 1-12 oder JAN-DEC
Tag der Woche 0-6 oder SUN-SAT

Zusammen werden Aufgaben, die in einem crontab geplant werden, wie folgt strukturiert:

minute hour day_of_month month day_of_week command_to_run

Hier ist ein funktionelles Beispiel eines Cron-Ausdrucks. Dieser Ausdruck führt jeden Dienstag um 17:30 Uhr den Befehl curl http://www.google.com aus:

30 17 * * 2 curl http://www.google.com

Außerdem gibt es einige Sonderzeichen, die Sie in die Planungs-Komponente eines Cron-Ausdrucks aufnehmen können, um die Planung zu erleichtern:

  • *: Ein Sternchen ist in einem Cron-Ausdruck ein Platzhalter, der „alle“ repräsentiert. Folglich wird eine Aufgabe, die mit * * * * * ...​​​ geplant wurde, jede Minute jeder Stunde an jedem Tag in jedem Monat ausgeführt.
  • ,: Kommas brechen die Planungswerte auf, um eine Liste zu bilden. Wenn Sie zu Beginn und in der Mitte jeder Stunde eine Aufgabe ausführen möchten, können Sie, anstatt zwei separate Aufgaben auszuschreiben (z. B. 0 * * * * ...​​​​​ und ​​​30 * * * * ...​​​), die gleiche Funktionalität mit einer erreichen (0,30 * * * * ...).
  • -: Ein Bindestrich stellt im Planungs-Feld einen Wertbereich dar. Anstatt 30 separate geplante Aufgaben für einen Befehl zu haben, den Sie in den ersten 30 Minuten jeder Stunde ausführen möchten (wie in 0 * * * * ...​​​, 1 * * * * ..., 2 * * * * ... usw.), können Sie es folgendermaßen festlegen: 0-29 * * * * ...​​​.
  • /: Sie können einen Schrägstrich mit einem Sternchen verwenden, um einen Schrittwert auszudrücken. Anstatt zum Beispiel acht separate Cron-Aufgaben auszuschreiben, um einen Befehl alle drei Stunden auszuführen (0 0 * * * ...​​​​​, ​​​​​​0 3 * * * ...​​​​​​, ​​​​​​0 6 * * * ...​​​​​​ usw.), können Sie es folgendermaßen festlegen: ​​​​​​0 */3 * * * ...​​​​​​. 

Anmerkung: Sie können Schrittwerte nicht willkürlich ausdrücken. Sie können nur ganze Zahlen verwenden, die sich gleichmäßig in den vom betreffenden Feld erlaubten Bereich teilen lassen. Im Feld „Stunden“ könnten Sie nach einem Schrägstrich beispielsweise nur 1, 2, 3, 4, 6, 8 oder 12 eingeben.

Hier sind weitere Beispiele für die Verwendung von Crons Planungs-Komponente:

  • * * * * * – Den Befehl jede Minute ausführen.
  • 12 * * * * – Den Befehl 12 Minuten nach jeder vollen Stunde ausführen.
  • 0,15,30,45 * * * * – Den Befehl alle 15 Minuten ausführen.
  • */15 * * * * – Den Befehl alle 15 Minuten ausführen.
  • 0 4 * * * – Den Befehl jeden Tag um 4:00 Uhr ausführen.
  • 0 4 * * 2-4 – Den Befehl jeden Dienstag, Mittwoch und Donnerstag um 4:00 Uhr ausführen.
  • 20,40 */8 * 7-12 * – Den Befehl 20 und 40 Minuten nach jeder achten Stunde jedes Tages der letzten 6 Monate des Jahres ausführen.

Wenn etwas für Sie unklar ist oder wenn Sie beim Schreiben Ihrer eigenen Cron-Aufgaben Hilfe benötigen, bietet Cronitor einen praktischen Planungs-Ausdruck-Editor für Cron namens „Crontab Guru“, mithilfe dessen Sie überprüfen können, ob Ihre Pläne gültig sind.

Crontabs verwalten

Sobald Sie einen Zeitplan festgelegt haben und wissen, welchen Auftrag Sie ausführen möchten, müssen Sie ihn irgendwo ablegen, wo Ihr Daemon ihn lesen kann.

Wie zuvor erwähnt ist ein crontab eine spezielle Datei, die den Zeitplan für die Aufträge enthält, die Cron ausführen wird. Diese sollen jedoch nicht direkt bearbeitet werden. Stattdessen wird empfohlen, den Befehl crontab zu verwenden. Dadurch können Sie das crontab Ihres Benutzerprofils bearbeiten, ohne Ihre Berechtigungen mit sudo zu ändern. Der Befehl crontab lässt Sie auch wissen, ob Sie Syntaxfehler im crontab haben. Eine direkte Bearbeitung wird dies nicht tun.

Sie können Ihren crontab mit dem folgenden Befehl bearbeiten:

  • crontab -e

Dadurch wird Ihr crontab in dem Standard-Texteditor Ihres Benutzerprofils geöffnet.

Anmerkung: Auf neuen CentOS-8-Servern öffnet der Befehl crontab -e den crontab Ihres Benutzers standardmäßig mit vi. vi ist ein extrem leistungsfähiger und flexibler Texteditor. Er kann jedoch für Benutzer, die keine Erfahrung damit haben, schwer verständlich wirken.

Wenn Sie einen einfacheren Texteditor als Ihren Standard-Editor für crontab verwenden möchten, können Sie nano als solchen installieren und konfigurieren.

Installieren Sie dazu nano mit dnf:

  • sudo dnf install nano

Wenn Sie aufgefordert werden, drücken Sie y und dann die EINGABETASTE, um zu bestätigen, dass Sie nano installieren möchten.

Um nano als Ihren visuellen Standard-Editor Ihres Benutzerprofils einzustellen, öffnen Sie die Datei .bash_profile zur Bearbeitung. Nachdem Sie nano jetzt installiert haben, können Sie dies damit tun:

  • nano ~/.bash_profile

Fügen Sie am unteren Ende der Datei die folgende Zeile hinzu:

~/.bash_profile
. . .
export VISUAL="nano"

Dadurch wird die Umgebungsvariable VISUAL auf nano festgelegt. VISUAL ist eine Unix-Umgebungsvariable, die viele Programme – einschließlich crontab – zur Bearbeitung einer Datei aufrufen. Speichern und schließen Sie die Datei nach dem Hinzufügen dieser Zeile, indem Sie STRG + X, Y, dann die EINGABETASTE drücken.

Laden Sie dann .bash_profile neu, damit die Shell die neue Änderung aufnimmt:

  • . ~/.bash_profile

Im Editor können Sie jeden Auftrag für Ihren Zeitplan auf einer neuen Zeile eingeben. Andernfalls können Sie den crontab vorerst speichern und schließen. Wenn Sie Ihren crontab mit vi, dem Standard-Texteditor von CentOS 8, geöffnet haben, können Sie das tun, indem Sie ESC drücken, um sicherzustellen, dass Sie sich im Befehlsmodus von vi befinden. Dann geben Sie :x ein und drücken die EINGABETASTE.

Bitte beachten Sie, dass auf Linux-Systemen ein weiteres crontab unter dem Verzeichnis /etc/ gespeichert ist. Dies ist ein systemweites crontab, das ein zusätzliches Feld für das Benutzerprofil hat, unter dem jeder Cron-Auftrag ausgeführt werden soll. Dieses Tutorial konzentriert sich auf benutzerspezifische crontabs. Wenn Sie den systemweiten crontab bearbeiten möchten, können Sie das mit dem folgenden Befehl tun:

  • sudo nano /etc/crontab

Wenn Sie den Inhalt Ihres crontab anzeigen, ihn aber nicht bearbeiten möchten, können Sie folgenden Befehl verwenden:

  • crontab -l

Sie können Ihren crontab mit dem folgenden Befehl löschen:

Warnung: Der folgende Befehl wird Sie nicht auffordern, zu bestätigen, dass Sie Ihren crontab löschen möchten. Führen Sie ihn nur aus, wenn Sie sicher sind, dass Sie ihn löschen möchten.

  • crontab -r

Dieser Befehl löscht den crontab des Benutzers sofort. Sie können jedoch das Flag -i inkludieren, damit der Befehl Sie auffordert, zu bestätigen, dass Sie den crontab des Benutzers tatsächlich löschen möchten:

  • crontab -r -i
Output
crontab: really delete sammy's crontab?

Wenn Sie aufgefordert wird, müssen Sie y eingeben, um den crontab zu löschen, oder n, um die Löschung abzubrechen.

Cron-Auftrags-Ausgabe verwalten

Da Cron-Aufträge im Hintergrund ausgeführt werden, ist nicht immer erkennbar, dass sie erfolgreich ausgeführt wurden. Sie wissen bereits, wie Sie den Befehl crontab verwenden und einen cron-Auftrag planen können. Jetzt können Sie verschiedene Möglichkeiten der Umleitung der Ausgabe von Cron-Aufträgen ausprobieren, damit Sie deren erfolgreiche Ausführung besser nachverfolgen können.

Wenn ein mail transfer agent​​ – wie z. B. Sendmail – auf Ihrem Server installiert und richtig konfiguriert ist, können Sie die Ausgabe von Cron-Aufgaben an die E-Mail-Adresse senden, die mit Ihrem Linux-Benutzerprofil verknüpft ist. Sie können auch eine E-Mail-Adresse manuell angeben, indem Sie oben im crontab die Einstellung MAILTO bereitstellen.

Sie können einem crontab beispielsweise die folgenden Zeilen hinzufügen. Dazu gehören eine MAILTO-Anweisung, gefolgt von einer Beispiels-E-Mail-Adresse, eine SHELL-Anweisung, die die Shell angibt, die ausgeführt werden soll (in diesem Fall bash), eine HOME-Anweisung, die auf den Pfad verweist, auf dem nach der Cron-Binärdatei gesucht werden soll, sowie eine einzelne Cron-Aufgabe:

. . .

MAILTO="example@digitalocean.com"
SHELL=/bin/bash
HOME=/

* * * * * echo ‘Run this command every minute’

Dieser spezielle Auftrag gibt „Diesen Befehl jede Minute ausführen“ zurück und diese Ausgabe wird jede Minute an die E-Mail-Adresse gesendet, die nach der MAILTO-Anweisung angegeben wurde.

Sie können die Ausgabe einer Cron-Aufgabe auch in eine Protokolldatei oder an einen leeren Ort umleiten, um eine E-Mail mit der Ausgabe zu verhindern.

Um die Ausgabe eines geplanten Befehls einer Protokolldatei anzufügen, fügen Sie >> am Ende des Befehls hinzu, gefolgt von dem Namen und dem Ort Ihrer gewünschten Protokolldatei. Das sieht folgendermaßen aus:

* * * * * echo ‘Run this command every minute’ >> /directory/path/file.log

Nehmen wir an, Sie möchten Cron verwenden, um ein Skript auszuführen, aber Sie möchten es im Hintergrund ausführen. Dazu können Sie die Ausgabe des Skripts zu einem leeren Ort wie /dev/null umleiten, der alle Daten, die an ihn geschrieben werden, sofort löscht. Der folgende Cron-Auftrag führt z. B. ein PHP-Skript aus und führt es im Hintergrund aus:

* * * * * /usr/bin/php /var/www/domain.com/backup.php > /dev/null 2>&1

Dieser Cron-Auftrag leitet auch standard error – durch 2 dargestellt – zu Standard-Ausgabe um (>&1). Da die Standard-Ausgabe bereits auf /dev/null umgeleitet wird, ermöglicht dies dem Skript im Grunde eine stille Ausführung. Selbst wenn der crontab eine MAILTO-Anweisung enthält, wird die Ausgabe des Befehls nicht an die angegebene E-Mail-Adresse gesendet.

Zugriff einschränken

Mit den Dateien cron.allow und cron.deny können Sie verwalten, welche Benutzer den Befehl crontab verwenden dürfen. Beide sind im Verzeichnis /etc/ gespeichert. Wenn die Datei cron.deny vorhanden ist, wird jeder Benutzer, der in der Datei aufgeführt ist, an der Bearbeitung seines crontabs gehindert. Wenn cron.allow vorhanden ist, können nur Benutzer, die darin aufgelistet sind, ihre crontabs bearbeiten. Wenn beide Dateien vorhanden sind und der gleiche Benutzer in beiden Listen aufgeführt ist, überschreibt die Datei cron.allow die Datei cron.deny, und der Benutzer kann seinen crontab bearbeiten.

Um beispielsweise allen Benutzern den Zugriff zu verwehren und dann dem Benutzer ishmael Zugriff zu geben, können Sie die folgende Befehlssequenz verwenden:

  • sudo echo ALL >>/etc/cron.deny
  • sudo echo ishmael >>/etc/cron.allow

Wir sperren zunächst alle Benutzer, indem wir ALL an die Datei cron.deny anfügen. Indem wir dann den Benutzernamen an die Datei cron.allow anfügen, geben wir dem Benutzerprofil ishmael Zugriff zum Ausführen von Cron-Aufträgen.

Beachten Sie, dass ein Benutzer mit sudo-Berechtigungen das crontab eines anderen Benutzers mit dem folgenden Befehl bearbeiten kann:

  • sudo crontab -u user -e

Wenn jedoch cron.deny vorhanden ist und user darin aufgelistet ist und er nicht in cron.allow aufgelistet ist, erhalten Sie nach Ausführung des vorherigen Befehls den folgenden Fehler:

Output
The user user cannot use this program (crontab)

Standardmäßig nehmen die meisten Cron-Daemons an, dass alle Benutzer Zugriff auf Cron haben, es sei denn, entweder cron.allow oder cron.deny ist vorhanden.

Spezielle Syntax

Es gibt auch verschiedene Kurzschriftbefehle, die Sie in Ihrer crontab-Datei verwenden können, um die Auftragsplanung zu optimieren. Diese sind im Grunde Shortcuts für den angegebenen entsprechenden numerischen Zeitplan:

Shortcut Kurzschrift für
@hourly 0 * * * *
@daily 0 0 * * *
@weekly 0 0 * * 0
@monthly 0 0 1 * *
@yearly 0 0 1 1 *

Anmerkung: Nicht alle Cron-Daemons können diese Syntax analysieren (insbesondere ältere Versionen). Vergewissern Sie sich daher, dass es funktioniert, bevor Sie sich darauf verlassen.

Zusätzlich führt die Kurzschrift @reboot jeden beliebigen Befehl aus, der ihr folgt, wenn der Server gestartet wird:

@reboot echo "System start up"

Verwenden Sie diese Shortcuts, wann immer es möglich ist, um die Auslegung des Aufgabenplans in Ihrem crontab zu erleichtern.

Zusammenfassung

Cron ist ein flexibles und leistungsfähiges Dienstprogramm, das die Belastung durch viele Aufgaben in Zusammenhang mit der Systemverwaltung verringern kann. In Kombination mit Shell-Skripts können Sie Aufgaben automatisieren, die normalerweise mühsam und kompliziert sind.

0 Comments

Creative Commons License