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 Ubuntu 18.04 ausführt. Dies könnte Ihr lokalen 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. Um dies einzurichten, folgen Sie unserem Leitfaden für die Ersteinrichtung des Servers unter Ubuntu 18.04.

Installation von Cron

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

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

  • sudo apt update

Installieren Sie dann Cron mit dem folgenden Befehl:

  • sudo apt install cron

Vergewissern Sie sich, dass auch die Ausführung im Hintergrund festgelegt ist:

  • sudo systemctl enable cron
Output
Synchronizing state of cron.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable cron

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

So funktioniert Cron

Cron-Aufträge 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/crontabs/ 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 an jeder achten Stunde jeden Tag 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

Wenn Sie den Befehl crontab das erste Mal unter diesem Benutzerprofil ausführen, werden Sie aufgefordert, einen Standard-Texteditor für die Bearbeitung Ihres crontabs auszuwählen.

Output
no crontab for sammy - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/nano <---- easiest 2. /usr/bin/vim.basic 3. /usr/bin/vim.tiny 4. /bin/ed Choose 1-4 [1]:

Geben Sie die Zahl ein, die dem Editor Ihrer Wahl entspricht. Alternativ können Sie einfach die EINGABETASTE drücken, um die Standardwahl nano zu akzeptieren.

Nachdem Sie Ihre Auswahl getroffen haben, werden Sie zu einem neuen crontab gebracht, das einige auskommentierte Anweisungen zu dessen Anwendung enthält:

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

Wenn Sie crontab -e in Zukunft ausführen, wird Ihr crontab automatisch in diesem Texteditor aufgerufen. Im Editor können Sie jeden Auftrag für Ihren Zeitplan auf einer neuen Zeile eingeben. Andernfalls können Sie das crontab vorerst speichern und schließen (CTRL + X, Y, dann die EINGABETASTE, wenn Sie nano ausgewählt haben).

​[note]
Hinweis: Auf Linux-Systemen ist ein weiteres crontab unter dem Verzeichnis /etc/ gespeichert. 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? (y/n)

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 können:

  • 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. Sie können beispielsweise ein Shell-Skript schreiben, um Daten-Backups zu einer Objekt-Speicherlösung zu senden, und es dann mit Cron automatisieren.

0 Comments

Creative Commons License