Eine frühere Version dieses Tutorials wurde von Shaun Lewis geschrieben.
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.
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.
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
OutputSynchronizing 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.
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.
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.
Outputno 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).
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
Outputcrontab: 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.
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.
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:
OutputThe 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.
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.
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.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!