Cron-Jobs werden über den Cron-Daemon gesteuert. Bei diesem handelt es
sich um einen Hintergrundprozess, der im Prinzip ständig die Uhrzeit
prüft und je nach seinen Einstellungen dann ggf. die ihm angegebenen
Programme startet. Diese Programme führen meist Wartungsaufgaben durch.
Die klassische Anwendung für Cron-Jobs ist z.B. das Löschen und
Archivieren von Logdateien (Logrotation). Auch das regelmäßige
Einspielen von Updates könnte von einem Cron-Job übernommen werden.
1) Script zum testen des Cron-Deamons:
Zunächst erstellen wir ein einfaches Shellscript , das wir dann
automatisch vom Cron-Deamon starten lassen.
Dieses Script schreibt das aktuelle Datum in die Datei /tmp/cron-test.txt.
Speichern tun wir das Skript unter /tmp.
#!/bin/bash
date >> /tmp/cron-test.txt
exit 0 |
Die Datei speichern wir als
"crontest.sh" ab und machen sie mit folgenden Kommando ausführbar:
chmod 755 crontest.sh
2)
Crontab Kommandos
export EDITOR=vi ;einen Editor für das crontab File definieren (default
ist VI).
crontab -e Editiert das crontab File, oder erzeugt eines, wenn keines
vorhanden war.
crontab -l Zeigt das crontab File an.
crontab -r Löscht das crontab File.
crontab -u BENUTZER Legt fest, mit welcher crontab-Datei
gearbeitet werden soll
3) Den Cron-Deamon konfigurieren:
Die Konfiguration des Daemons funktioniert über die /etc/crontab, eine
Tabelle in der steht welcher Prozeß zu welcher Zeit ausgeführt werden
soll.
Auf den Systemen kann jeder Benutzer seine eigene Crontab verwenden.
Eine systemweit geltende Crontab ist auf UNIX-Systemen im Normalfall
unter /etc/crontab hinterlegt.
Die /etc/crontab wird mit folgendem Kommando angelegt bzw. editiert:
crontab -e
Wenn für den angemeldeten User noch keine "crontab" existiert,
öffnet sich jetzt der vi mit einer leeren Datei mit Namen /etc/crontab.
Die "crontab" darf nur über das Kommando "crontab -e" erstellt oder
editiert werden. Das manuelle erstellen und editieren die /etc/crontab
funktioniert nicht!
Mit folgender Zeile starten wir unser Testskript beispielsweise alle 5 Minuten:
/etc/crontab:
#Testskript
5 * * * * /tmp/crontest.sh
|
4)
Die Syntax für die /etc/crontab:
In der Tabelle sind die Zeilen durch einen Zeilenumbruch getrennt. Die
Tabelle besteht aus sechs Spalten, in der systemweiten Crontab sind es
sieben.
Kommentare werden am Zeilenanfang mit # markiert. Die Spalten sind durch
Leerzeichen voneinander getrennt. Die ersten fünf Spalten beschreiben
die Zeit, zu der Befehl ausgeführt werden soll,
die letzte Spalte gibt den Befehl an sich an. Wird kein Benutzer
angegeben, läuft das Script im Kontext des Users, der die /etc/crontab
erstellt hat.
Minute Stunde Tag Monat Wochentag
Benutzer Befehl
Dabei gilt:
| Platzhalter |
mögliche Werte |
| MINUTE |
0-59 |
| STUNDE |
0-23 |
| TAG |
1-31 |
| MONAT |
1-12 oder Jan, Feb, Mar,... (englische Bezeichner!) |
| WOCHENTAG |
0-6, wobei 0 Sonntag bedeutet oder Sun, Mon, Tue,... |
| Benutzer |
Mit welchen Rechten soll das Script
gestartet werden z.B. root |
| BEFEHL |
/Pfad/script.sh |
Als Sonderzeichen steht das "*" zur Verfügung, was soviel
wie "egal" bedeutet. Sollen mehrere Möglichkeiten angeboten werden, sind
diese ohne Leerzeichen mit einem Komma voneinander zu trennen.
Zeitspannen
gibt man an, indem man einen Bindestrich ohne Leerzeichen zwischen
Anfangs- und Endwert setzt.
Immer dann, wenn die ersten fünf Einträge in
der crontab mit der Systemzeit übereinstimmen, wird der darauf folgende
Befehl ausgeführt.
Zahlenbereiche sind erlaubt. Bereiche
sind zwei Zahlen, getrennt durch einen Bindestrich. Die angegebenen
Grenzen sind inklusive.
Beispielsweise: 8-11 in "Stunde" bewirkt die Ausführung um 8, 9, 10, 11
Uhr.
Listen sind erlaubt. Eine Liste ist eine Menge von Nummern,
getrennt durch Kommata.
Beispiele: "1,2,5,9", "0-4,8-2".
Schrittweiten können in Verbindung mit Bereichen genutzt werden. Hinter
einem Bereich mit "/<Schrittweite>" angegeben, bestimmt die
Schrittweite, ob Werte innerhalb des Bereiches übersprungen werden.
Beispiel: "0-23/2" kann unter Stunden benutzt werden, um ein Kommando
alle zwei Stunden auszuführen.
Die Alternative wäre:
"0,2,4,6,8,10,12,14,16,18,20,22".
Schrittweiten sind auch nach Sternen (*) erlaubt, "alle zwei Stunden"
läßt sich auch durch "*/2" beschreiben.
Namen können für "Monat" und "Wochentag" benutzt werden. Benutzen Sie
die ersten drei Buchstaben des entsprechenden Tages oder Monats
(Groß-/Kleinschreibung wird
nicht beachtet). Bereiche oder Listen sind mit Namen nicht erlaubt.
4) Beispiele:
Diese Zeile startet das Script " /tmp/crontest.sh" jeden Monat am 15. um
4:30 Uhr:
30 4 15 * * /tmp/crontest.sh
Diese Zeile startet das Script " /tmp/crontest.sh" an jedem beliebigen Tag um 8, 12 und
21 Uhr.
0 8,12,21 * * * /tmp/crontest.sh
Der Job wird alle 10 Minuten ausgeführt
*/10 * * * * /tmp/crontest.sh
Wird am ersten Tag jedes Monats um 12:00 Uhr ausgeführt
0 12 1 * * /tmp/crontest.sh
Kommando wird täglich um 6:00 Uhr und um 18:00 Uhr mit root-Rechten
aufgerufen
0 6,18 * * * root /tmp/crontest.sh
Läuft täglich von Januar bis Juni
um 18:30 Uhr
30 18 * 1-6 * /tmp/crontest.sh
Ein Job, der jeden Dienstag und Donnerstag um 12 Uhr ausgeführt werden
soll:
00 12 * * 2,4 myjob
Ein Job, der zu jeder Stunde von 6 bis 18 Uhr ausgeführt werden soll:
00 6-18 * * * myjob
Ein Job der innerhalb dieses Zeitraums nur jede zweite Stunde ausgeführt
werden soll:
00 6-18/2 * * * myjob
Alle 5 Minuten einen Ping auf eine Internetadresse:
*/5 * * * * ping -c 1 www.fibel.org &> /dev/null
Eine Besonderheit ist die Angabe des Tages. Hier stehen zwei
Möglichkeiten zur Verfügung. Sie können den Tag des Monats und den
Wochentag angeben. Werden beide Informationen angegeben, dann wird der
Job zu dem Zeitpunkt ausgeführt wenn mindestens eine von den Angaben
zutrifft. Der folgende Befehl wird also nicht nur am Freitag, den 13.
ausgeführt, sondern er wird an jedem 13. Tag des Monats und an jedem
Freitag ausgeführt.
00 12 13 * 5 freitag_der_13.sh
5)
Email deaktivieren
Standardmäßig schickt Chron eine Mail an den User unter dessen Kontext
das Script ausgeführt wird.
Um da zu unterbinden lenkt man die Ausgabe des Scriptes nach /dev/null
(den Mülleimer) um.
30 18 * * * rm /home/tmp/* > /dev/null 2>&1
6) Email an einen bestimmten User schicken
Durch eintragen der "MAILTO" Zeile im Kopf der /etc/crontab werden alle
Ausgaben die die Scripte generieren an den dort angegebenen User
geschickt.
MAILTO=yourusername@yourdomain.com
30 18 * 1-6 * /tmp/crontest.sh
7) Ein
Logfile erzeugen:
30 18 * * * rm /home/tmp/* > /var/log/clean_tmp_dir.log
8) Rechtevergabe für Cronjobs:
"Crontab" kann nur aufgeführt werden, wenn der jeweilige in der /etc/cron.allow
steht.
Wenn das /etc/cron.allow File nicht existiert, kann man "Crontab"
ausführen, wenn der jeweilige User nicht in der /etc/cron.deny steht.
Wenn nur die /etc/cron.deny existiert, und niemand steht drinnen, dann
kann nur "root" crontab ausführen.
9) Den Cron Deamon neu starten:
rccron restart
(c)
Juergen Schilling 01.07.2009
|