Cron
Der cron-Daemon ist eine Jobsteuerung von Unix bzw. unixartigen Betriebssystemen wie Linux, BSD oder Mac OS X, die wiederkehrende Aufgaben (cronjobs) automatisch zu einer bestimmten Zeit ausführen kann.
Häufig führt der Cron-Daemon wichtige Programme für die Instandhaltung des Systems aus, wie zum Beispiel Dienste für das regelmäßige Archivieren und Löschen von Logdateien.
Der Cron-Daemon überwacht dazu verschiedene Dateien und Verzeichnisse, in denen Anweisungen liegen, die in regelmäßigen Abständen ausgeführt werden sollen. Diese Anweisungen werden Cron-Tabellen oder eben crontabs genannt. Cron läd beim Start all die Dateien und Verzeichnisse, die er überwacht in den Arbeitsspeicher und überprüft jede Minute einmal, ob darin Jobs enthalten sind, die in der aktuellen Minute ausgeführt werden sollen. Wenn ja, so führt er sie aus. Außerdem überprüft cron jede Minute, ob sich an den Dateien oder Verzeichnissen etwas geändert hat und - falls ja - übernimmt er diese Änderungen im Speicher. Es gibt also mehrere Möglichkeiten, dem Cron-Daemon einen Job zur Ausführung zu übergeben. Die einzelnen Möglichkeiten sind:
Es gibt mehrere Möglichkeiten, dem Cron-Daemon einen Job zur Ausführung zu übergeben. Die einzelnen Möglichkeiten sind:
User-Crontabs
Jeder User des Systems kann eine eigene Crontab (also eine Datei mit Anweisungen für Cron) erstellen und bearbeiten. Die Jobs, die darin aufgeführt sind werden von Cron unter der Userkennung des Users ausgeführt, um dessen Crontab-Datei es sich handelt. Die User-Crontabs werden nicht direkt mit einem Editor verändert, sondern mit dem Befehl crontab(1).
Systemweite Crontab-Datei
Im Verzeichnis /etc existiert eine Datei crontab, die ebenfalls Cronjobs definiert. Das Format dieser Datei unterscheidet sich etwas von dem der Usercrontabs - siehe weiter unten...
cron.d Verzeichnis
Im Verzeichnis /etc kann ein Verzeichnis cron.d existieren, das Dateien im selben Format wie /etc/crontab enthalten darf. Auch diese Dateien werden von cron überwacht und darin enthaltene Befehle werden ausgeführt. cron.{hourly,daily,weekly,monthly} Verzeichnisse Ebenfalls im /etc/verzeichnis können Verzeichnisse der Namen cron.hourly, cron.daily, cron.weekly und cron.monthly existieren. Diese Verzeichnisse enthalten nicht crontabs, sondern Shellscripts, die entsprechend stündlich, täglich, wöchentlich oder monatlich ausgeführt werden.
Aufbau einer Crontab Datei
Die auszuführenden Befehle werden in einer benutzereigenen Tabelle gespeichert, der sogenannten crontab. Jeder Benutzer kann eine crontab erstellen. Crontab-Einträge sind entweder Definitionen von Shellvariablen oder zeitgesteuerte Cron-Befehle. Leere Zeilen oder Zeilen, die mit einem # beginnen werden ignoriert.
Normalerweise schickt cron alle Ausgaben von ausgeführten Kommandos per Mail an den User, der das Cron-Kommando ausführen liess. Die Variable MAILTO kann diese Eigenschaft verändern. Wenn sie den Namen eines Users enthält, so werden ihm und nicht dem ursprünglichen Cron-User die Mail geschickt. Ist die Variable MAILTO definiert, aber leer, so wird gar keine Mail verschickt.
Diese zeitgesteuerten Cron-Befehle bestehen aus sechs Spalten; die ersten fünf dienen der Zeitangabe (Minute, Stunde, Tag, Monat, Wochentag), alle weiteren Zeichen bis zum Zeilenumbruch werden als der auszuführende Befehl aufgefasst. Die einzelnen Spalten werden durch Leerzeichen oder Tabulatoren getrennt.
Beispiel einer Crontab:
SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin MAILTO="" #M S T M W User Befehl 5 * * * * root /usr/bin/message.sh */5 * * * * root /usr/bin/message.sh 59 23 * * 0 root cp /var/log/messages /log/backup/messages 0 0 * * * root cp /var/log/syslog /log/backup/syslog 20,30 1 * * 1-5 root /usr/bin/work.sh
Der erste Befehl (beginnend mit 5…) wird fünf Minuten nach jeder vollen Stunde, der zweite alle 5 Minuten (die Schrittweite wird durch */Schrittweite angegeben), der dritte einmal pro Woche sonntags um 23:59 Uhr, der vierte täglich um 00:00 Uhr und der fünfte montags bis freitags jeweils um 01:20 und 01:30 ausgeführt.
Die Struktur der Befehlszeile ist wie folgt zu verstehen:
* * * * * auszuführender Befehl ┬ ┬ ┬ ┬ ┬ │ │ │ │ │ │ │ │ │ └──── Wochentag (0-7 oder Sun, Mon, Tue,etc) (Sonntag =0 oder =7) │ │ │ └────── Monat (1-12 oder Jan, Feb, etc) │ │ └──────── Tag (1-31) │ └────────── Stunde (0-23) └──────────── Minute (0-59)
Ein Feld für eine Zeitangab kann dabei mehrere Angaben enthalten:
| Syntax | Beispiel | |
| Voller Bereich | * | Bei Minute: 0,1,2,3,...,59 |
| Ausgweählter Bereich | 1-5 | entspricht 1,2,3,4,5 |
| Liste | 1,5,10 | nur an den angegebenen Werten |
| Kombination | 2,5,30-40 | Kombination aus Liste und Bereich |
| Schritte | */5 | bei Minute: alle 5 Minuten |
| Kombination | 2-47/5 | alle 5 Minten im Bereich 2-47 (2,7,12,...) |
Werden in einem Feld Namen benutzt, so sind Bereiche und Listen nicht erlaubt.
Die Datei enthält nun als 6. Feld den Benutzer, in dessen Auftrag das Programm auszuführen ist. Bei allen User Crontabs entfällt der Eintrag, da die enthaltenen Kommandos immer mit den Rechten des Eigentümers der Datei gestartet werden.
Das letzte Feld beinhaltet in jeder »crontab« das auszuführende Kommando. Ein Prozentzeichen »%« kann benutzt werden, um einen Zeilenumbruch zu simulieren, alle folgenden Daten werden dem Kommando als Argumente übergeben.
Verwalten von User Crontabs
Ansehen der aktuellen Crontab
root@nazgul:~# crontab -l
Erstellen / Bearbeiten der Crontab
root@nazgul:~# crontab -e
Löschen der Crontab
root@nazgul:~# crontab -r
Ansehen der Crontab eines anderen Benutzers (nur root)
root@nazgul:~# crontab -lu tina
In vielen Linux Distributionen findet man folgende Zeilen in der crontab:
# run-parts 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly
Die Cronjobs werden also auf spezielle Verzeichnisse, in denen die Scripte gespeichert sind, ausgelagert. Die Scripte in /etc/cron.hourly werden dann z. B. jede Stunde ausgeführt.
Ansonsten würde die Crontab unter Umständen sehr groß werden.
Optionen
| Option | Bedeutung |
|---|---|
| -l | listet aktive Crontab |
| -r | entfernt aktive Crontab |
| Datei | setzt Inhalt der Datei als aktive Crontab |
| -u User | bezug auf die Crontab des angebenen Users |
Crontab eines Benutzers anzeigen
root@nazgul:~# crontab -l