Copyright © 1995 by O'Reilly/International Thomson Verlag

Bitte denken Sie daran: Sie dürfen zwar die Online-Version ausdrucken, aber diesen Druck nicht fotokopieren oder verkaufen.

Wünschen Sie mehr Informationen zu der gedruckten Version des Buches "Linux - Wegweiser zur Installation & Konfiguration", dann klicken Sie hier.


Kapitel 4

Jobs ausführen mit cron

Computer wurden zuerst entwickelt, um Routineaufgaben automatisch zu erledigen. Wenn Sie täglich morgens um eins Ihre Festplatte sichern müssen, besteht kein Grund, dies jedesmal von Hand zu erledigen -- erst recht nicht, wenn Sie dafür aus dem Bett kriechen müßten. Es sollte möglich sein, den Computer einmal anzuweisen, den Job zu erledigen und ihm die Angelegenheit dann zu überlassen. Auf UNIX-Systemen übernimmt cron diese Art der Automatisierung für Sie.

Kurz gesagt, benutzen Sie cron , indem Sie den Befehl crontab aufrufen und Zeilen in einem bestimmten Format eingeben, das von cron erkannt wird. Jede Zeile enthält einen auszuführenden Befehl sowie die Uhrzeit der Ausführung.

Hinter Ihrem Rücken speichert crontab die Befehle in einer Datei im Verzeichnis /var/spool/cron/crontabs , die Ihren Benutzernamen trägt. (Meine crontab -Datei würde also /var/spool/cron/crontabs/mdw heißen.) Ein Dämon namens crond liest diese Datei regelmäßig und führt zu den richtigen Zeiten die Befehle aus. Eine der rc -Dateien Ihres Systems startet beim Booten den crond . Es gibt eigentlich keinen Befehl namens cron , sondern nur das Programm crontab und den Dämon crond .

Auf einigen Systemen kann cron nur von root benutzt werden. Wir wollen uns trotzdem einen nützlichen Befehl ansehen, den Sie als root vielleicht ausführen möchten und dabei zeigen, wie Sie daraus einen Eintrag für crontab machen. Nehmen wir an, daß Sie einmal täglich alte Dateien aus dem Verzeichnis /tmp löschen wollen, das als temporärer Speicherplatz für Dateien dient, die von allen möglichen Programmen erzeugt werden.

Die meisten Systeme leeren /tmp beim Booten, aber wenn Ihr System für längere Zeit ununterbrochen läuft, ist es vielleicht sinnvoll, mittels cron die alten Dateien im Auge zu behalten und sie zu löschen (z.B. Dateien, auf die drei Tage lang nicht zugegriffen wurde). Der Befehl, den Sie dazu aufrufen, ist:

rm -f dateiname

Woher wissen Sie aber, welchen Dateinamen Sie angeben sollen? Sie müssen den Löschbefehl innerhalb eines Suchbefehls ( find ) aufrufen, der alle Dateien in einem Verzeichnis auflistet und mit diesen Dateien die gewünschte Operation durchführt.

Wir sind dem Befehl find bereits im Abschnitt » Inkrementelle Backups « begegnet. In diesem Beispiel geben wir /tmp als das zu durchsuchende Verzeichnis an und benutzen die Option -atime , um alle Dateien zu finden, auf die zuletzt vor mindestens drei Tagen zugegriffen wurde. Mit der Option -exec bewirken wir, daß der folgende Befehl mit allen gefundenen Dateien ausgeführt wird.

find /tmp -atime +3 \! -type d -exec rm -f {} \;

Wir haben bereits gesehen, daß der eigentliche Befehl, den find für uns ausführen soll, rm -f ist. Die geschweiften Klammern {} bedeuten: »Führe den Befehl mit jeder Datei aus, die der Suchlauf findet«. Der String \; zeigt find , daß hier die Option -exec beendet ist.

Jetzt haben wir also den Befehl, der alte Dateien aus /tmp entfernt. Wir müssen aber noch festlegen, wie oft das geschehen soll. crontab benutzt dazu folgende sechs Felder:

minute stunde tag monat wochentag befehl

Und so füllen Sie die Felder aus:

  1. Minute (geben Sie zwischen 0 und 59 an)

  2. Stunde (geben Sie zwischen 0 und 23 an)

  3. Tag des Monats (geben Sie zwischen 1 und 31 an)

  4. Monat (geben Sie zwischen 1 und 12 oder einen Namen wie jan, feb usw. an)

  5. Wochentag (geben Sie zwischen 0 und 6 an, wobei 0 der Sonntag ist, oder einen Namen wie mon, tue usw.)

  6. Befehl (kann aus mehreren Wörtern bestehen)

Abbildung 4--1. zeigt einen cron -Eintrag, in dem alle Felder ausgefüllt sind. Der Befehl ist ein Shell-Skript, das unter der Bourne-Shell sh aufgerufen wird. Allerdings ist dies kein allzu realistischer Eintrag -- das Skript wird nur ausgeführt, wenn alle Bedingungen in den ersten fünf Feldern erfüllt sind. Es würde also nur an einem Sonntag aufgerufen, der auf den 15. im Januar oder Juli fällt -- das kommt wohl nicht sehr oft vor! Dies ist also kein wirklichkeitsnahes Beispiel.

Abbildung 4-1. Beispielhafter cron-Eintrag

rutabaga# crontab -e

Als Voreinstellung wird mit diesem Befehl der Editor vi aufgerufen. Wenn Sie statt dessen lieber Emacs benutzen möchten, können Sie das vor der Anpassung von crontab einstellen. Bei einer Bourne-kompatiblen Shell geben Sie dazu ein:

rutabaga# export VISUAL=emacs

Für die C-Shell lautet der entsprechende Befehl:

rutabaga# setenv VISUAL emacs

Die Environment-Variable EDITOR kann mit einigen Versionen von crontab statt der Variablen VISUAL benutzt werden.

Geben Sie zunächt eine oder zwei Kommentarzeilen ein, die mit einem Doppelkreuz (#) beginnen, und dann den crontab -Eintrag:

# Remove files from /tmp that are 3 (or more days) old.  Runs at 1:00 AM
# each morning.
0 1 * * * find /tmp -atime +3 \! -type d -exec rm -f {} \;

Mit dem Verlassen von vi werden die Befehle gespeichert. Mit folgendem Befehl lassen Sie sich Ihre crontab -Einträge anzeigen:

rutabaga# crontab -l

Wir zeigen Ihnen ein weiteres Beispiel für einen Befehl, der häufig in crontab -Dateien steht, um ein Verzeichnis auf ein Magnetband zu sichern. Wir gehen davon aus, daß jemand ein Magnetband eingelegt hat, bevor der Befehl ausgeführt wird. Zunächst sorgt der Befehl mt dafür, daß das Band im Gerät /dev/rft0 an den Anfang zurückgespult wird. Anschließend überträgt ein tar -Befehl alle Dateien aus dem Verzeichnis /src auf das Band. Die Befehle werden durch ein Semikolon getrennt, wie es die Shell-Syntax verlangt.

# back up the /src directory once every two months.
0 2 1 */2 * mt -f /dev/rft0 rewind; tar cf /dev/rft0 /src

Die ersten beiden Felder bewirken, daß der Befehl um zwei Uhr morgens aufgerufen wird; das dritte Feld bestimmt den ersten Tag des Monats. Das vierte Feld legt jeden zweiten Monat fest. Dasselbe Ergebnis würden wir mit folgendem Befehl erzielen, der vielleicht einfacher zu lesen ist:

0 2 1 jan,mar,may,jul,sep,nov * mt -f /dev/rft0 rewind; tar cf /dev/rft0 /src

Im Abschnitt » Backups erstellen « erklären wir, wie Backups regelmäßig durchgeführt werden können.

Bei der Benutzung von cron sollten Sie auch überlegen, was mit den Meldungen geschieht, die von den Befehlen erzeugt werden. cron hebt alle Meldungen aus der Standardausgabe und der Standardfehlerausgabe auf und verschickt sie als Mail an den Benutzer. Im obigen Beispiel geht die Mail an root, aber Sie sollten das automatisch an sich selbst als Systemverwalter umlenken lassen. Tragen Sie auf jeden Fall diese Zeile in /usr/lib/aliases ein:

root: ihr-account-name

Das folgende Beispiel ruft mailq jeden zweiten Tag auf, um zu testen, ob in der Mail-Warteschlange irgendwelche Nachrichten hängengeblieben sind, und verschickt das Ergebnis des Tests als Mail an den Mail-Verwalter. Falls Nachrichten in der Warteschlange zurückgeblieben sind, enthält die Benachrichtigung Details zu Adressierungs- und Zustellproblemen, ansonsten ist die Benachrichtigung leer:

0 6 */2 * * mailq -v | mail-s "Tested Mail Queue for Stuck Email" postmaster

Wahrscheinlich möchten Sie nicht jeden Tag eine Nachricht erhalten, solange alles problemlos klappt. In den Beispielen, die wir bisher gezeigt haben, erzeugen die Befehle nur dann Meldungen, wenn Fehler auftreten. Vielleicht möchten Sie es aber auch zur Regel machen, die Standardausgabe nach /dev/null umzulenken oder sie folgendermaßen in eine Datei zu schreiben (beachten Sie die zwei >-Zeichen, damit der alte Inhalt nicht überschrieben wird):

0 1 * * * find /tmp -atime +3 \! -type d -exec rm -f {} \; >>/home/mdw/log

Mit diesem Eintrag lenken wir die Standardausgabe um, aber die Standardfehlerausgabe kann als Mail verschickt werden. Dies kann ganz praktisch sein, weil wir eine Nachricht erhalten, wenn etwas schiefgeht. Wenn Sie sicherstellen möchten, daß Sie auf keinen Fall Mail erhalten, lenken Sie sowohl die Standardausgabe als auch die Standardfehlerausgabe um:

0 1 * * * find /tmp -atime +3 \! -type d -exec rm -f {} \; >>/home/mdw/log 2>&1

Falls Sie die Meldungen in eine Logdatei schreiben, sehen Sie sich mit einer ständig größer werdenden Datei konfrontiert. Eventuell sollten Sie einen weiteren cron -Eintrag erzeugen, der diese Datei z.B. einmal in der Woche löscht.

In den Einträgen für crontab lassen sich nur die Befehle der Bourne-Shell benutzen. Sie können also nicht auf die komfortablen Erweiterungen zurückgreifen, die bash und andere moderne Shells bieten -- etwa Aliasnamen oder die Abkürzung ~ für das Home-Verzeichnis. Allerdings können Sie $HOME benutzen -- cron kennt die Environment-Variablen $USER, $HOME und $SHELL. Alle Befehle benutzen Ihr Home-Verzeichnis als das aktuelle Verzeichnis.

Einige Leute ziehen es vor, in crontab -Einträgen immer die absoluten Pfadnamen der Befehle anzugeben, wie z.B. /usr/bin/find und /bin/rm . Damit stellen sie sicher, daß immer der richtige Befehl gefunden wird, statt sich darauf zu verlassen, daß die Variable PATH richtig gesetzt ist.

Wenn ein Befehl so lang und kompliziert wird, daß er nicht mehr in eine Zeile paßt, sollten Sie ein Shell-Skript schreiben und dieses von cron aufrufen lassen. Sorgen Sie dafür, daß das Skript ausführbar ist (mit chmod +x ) oder starten Sie für den Aufruf eine Shell:

0 1 * * * sh runcron

Als Systemverwalter werden Sie häufig crontab -Dateien für fiktive Benutzer wie news oder uucp anlegen. Es wäre unnötig und potentiell gefährlich, alle Utilities als root ausführen zu lassen, deshalb gibt es diese speziellen Benutzer.

Die Wahl des Benutzers hat auch Einfluß auf die Dateieignerschaft: eine crontab -Datei für news sollte Dateien ausführen, die news gehören usw. Sie sollten ganz allgemein sicherstellen, daß die Utilities dem Benutzer gehören, in dessen Namen Sie die crontab -Datei erstellen.

Bedenken Sie auch, wer die entstehenden Dateien mit den Systemmeldungen nutzen soll. Wenn ein cron -Eintrag, der unter news aufgerufen wird, eine Datei erzeugt, werden Sie eventuell Schwierigkeiten haben, diese Datei später unter einer anderen Benutzerkennung zu lesen. Eventuell müssen Sie in Ihrem cron -Skript chown oder chmod benutzen, um die Datei hinterher auswerten zu können.

Im Abschnitt » Die Dateiberechtigungen « in Kapitel 3 besprechen wir diese Befehle.

Da Sie nicht als news einloggen können, müssen Sie die crontab-Datei von news unter root mit dem Befehl:

rutabaga# crontab -e -u news

bearbeiten.


Inhaltsverzeichnis Vorherige Abschnitt Nächste Abschnitt