Kurztipp: Aufgaben automatisieren mit CRON

 Zielgruppe: Fortgeschrittene 

Der cron Dämon ist ein Programm welches im Hintergrund läuft und zu angegebenen Zeiten andere Programme ausführt. Dies ist besonders dann von Vorteil, wenn man leicht automatisierbare Aufgaben zu erledigen hat, wie etwa das Erstellen einer Sicherheitskopie von wichtigen Daten. In diesem Artikel findest du ein einfaches Beispiel, wie man dem cron mitteilt wann er eine Aufgabe erledigen soll.

Bei den meisten Distributionen wird gar nicht erst gefragt, ob du den cron haben willst. Der ist dann einfach mit dabei. Ob das gut ist oder nicht, ist eine andere Thematik. Aber so kannst du das hier Vorgestellte wenigstens gleich ausprobieren.

Zunächst einmal ist es sinnvoll, einen Test zu machen, bevor man schwerwiegende und umfangreiche Programmstarts durchführt. Hier soll ein kleines Script dazu dienen, die Aktivität des cron nachzuvollziehen:

#!/bin/bash

date >> $HOME/CRON-DATEI.txt

exit 0

Nachdem man nun den obigen Text in einer Datei namens "cronscript.sh" abgespeichert hat, muss man noch sicherstellen, dass diese auch ausführbar ist:

chmod 755 cronscript.sh

Der Einfachheit halber lässt du diese Datei für diesen Test in deinem Home-Verzeichnis. Ein richtiges Backup-Script würde man natürlich in den ausführbaren Pfad kopieren, also etwa nach /usr/bin oder so. Wenn das Script nicht in einem der Verzeichnisse ist, welche durch Eingabe von

echo $PATH

angezeigt werden, dann muss man den kompletten Pfad zum Script mit angeben. Nun soll es darum gehen, eine so genannte "crontab" anzulegen. Die crontab ist quasi die Tabelle bzw. Datei in der steht, wann der cron welches Kommando ausführen soll. Bei fast allen gängigen Linux-Distributionen kannst du deine persönliche crontab verändern, indem du als normaler User

crontab -e

eingibst. Dann erscheint ein voreingestellter Editor und zeigt wahrscheinlich eine leere Datei, wenn du noch keine crontab hast. Wenn dir der Editor nicht passt, dann gib doch einfach

export EDITOR=emacs

ein. - Du kannst hier "emacs" natürlich auch durch jeden anderen Editor ersetzen, der bei dir läuft. - Was muss in die crontab jetzt rein? Die Syntax einer Zeile der crontab sieht folgendermaßen aus:

MINUTE STUNDE TAG MONAT WOCHENTAG 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,...
BEFEHL Dies ist der auszuführende Befehl!
Alles was danach kommt, wird als Argument dem Befehl übergeben.


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. Ein Beispiel:

33 4 31 2 0 $HOME/cronscript.sh

...führt also das obige Script jeden Sonntag um 4:33 Uhr aus, der auf den 31. Februar fällt. Also nicht wirklich oft. Je nachdem, was man machen möchte, sind da Einträge wie dieser hier schon sinnvoller:

0 8,12,21 * * * $HOME/cronscript.sh

...führt das Script nun an jedem beliebigen Tag um 8, 12 und 21 Uhr aus, sofern der Rechner zu diesem Zeitpunkt läuft. Für einen kleinen Test kannst du ja eine crontab schreiben, die das Script jede Minute ausführt:

#TEST!
* * * * * $HOME/cronscript.sh

Wenn alles klappt, dann sollte in der Datei CRON-DATEI.txt in deinem Home-Verzeichnis mit der Zeit eine lange Liste von Datums-/Zeiteinträgen entstehen. Falls nicht, kann es sein, dass du als normaler User keine Erlaubnis hast, cronstabs anzulegen. Dann musst du, falls nicht vorhanden, eine Datei /etc/cron.allow anlegen und deinen Usernamen reinschreiben. Neben dieser User-crontab gibt es auch noch systemweite crontabs, die man (zumindest bei Debian) unter /etc/cron.d findet. Hierbei gibt es einen zusätzlichen Eintrag vor dem Kommando, der für den Usernamen vorbehalten ist, mit dessen Rechten das Kommando ausgeführt werden soll. Unter /etc/cron.daily, /etc/cron.weekly und /etc/cron.monthly kann man ganz normale Shell-Scripte ablegen, die dann bei Debian so in etwa täglich, wöchentlich und monatlich abgearbeitet werden, sofern dies möglich ist. Diese Scripte folgen nicht der crontab-Syntax und sind natürlich genauso wie die crontabs unter /etc/cron.d nur vom User root anzulegen.

So, wenn du jetzt mit cron etwas sinnvolles machen willst (ein Backup?), dann musst du nur noch das cronscript umschreiben und umbenennen, eine vernünftige Zeitfestlegung wählen und das Script optimalerweise im Pfad speichern. Das "$HOME/" vor dem Namen des Scriptes in der crontab musst du dann wegnehmen. Ich empfehle die dauerhafte Installation der crontab bzw. des Scriptes in den Verzeichnissen unterhalb von /etc vorzunehmen.