Zeitversetzte Arbeiten
Willemers Informatik-Ecke

UNIX bietet die Möglichkeit, Befehle zeitversetzt auszuführen. Für regelmäßig wiederkehrende Arbeiten gibt es die crontab. Soll ein Job genau einmal laufen, verwendet man das Kommando at.

Ausgaben in die Mail

Da zum Ausführungszeitpunkt die aufrufende Shell mit großer Wahrscheinlichkeit nicht vorhanden ist, werden die Ausgaben der zeitversetzt gestarteten Prozesse dem Aufrufer per Mail zugestellt.

Die aktuelle Zeit

Bevor man aber Aufträge in die Nacht verlegt, sollte man kontrollieren, welche Uhrzeit der Computer derzeit glaubt zu haben. Dazu hilft der Befehl date, der entgegen seinem Namen auch die Uhrzeit liefert.

gaston > date
Don Jan  3 20:34:44 CET 2002

Vom Administrator kann der Befehl auch verwendet werden, um die Uhrzeit zu setzen. Dabei wird direkt hinter dem Befehl das neue Datum in direkter Ziffernfolge ohne Sonderzeichen gesetzt. Beispiel:

gaston # date  01032044
Don Jan  3 20:44:00 CET 2002

Die 8 Ziffern werden nach dem Muster MMDDhhmm angegeben, also je zwei Stellen für Monat, Tag, Stunde und Minute. Es kann das Jahr mit zwei oder vier Stellen angehängt werden, wenn das ebenfalls zu ändern ist.

Zeitformat ist änderbar

Nützlich ist die Möglichkeit, die Ausgabe von date zu formatieren. Dazu wird hinter einem Pluszeichen eine Zeichenkette (meist in Anführungszeichen) mit einem Formatmuster angegeben. Das Datum in deutscher Schreibweise würde man mit dem folgenden Befehl erzeugen:

gaston > date +"%d.%m.%Y"
03.01.2002

Die wichtigsten Formatzeichen haben folgende Bedeutung:

Kürzel Bedeutung
%H Stunden (00-23)
%M Minuten (00-59)
%S Sekunden (00-59)
%d Tag im Monat (00-31)
%m Monat (00-12)
%y zweistelliges Jahr (00-99)
%Y Die vollständige Jahreszahl

Der besondere Nutzen der Formatierung wird deutlich, wenn man Protokolldateien Namen vergeben will, die mit ihrer Entstehung zu tun haben, wie man es in Skripten oder crontabs braucht. Der Dateiname im folgenden Beispiel würde am 3. Januar proto03 heißen.

proto`date +%d`

Hardwareuhr

Auf einem PC unter Linux wird die Uhrzeit durch eine Hardware-Uhr gehalten, die batteriegespeist auch beim Ausschalten des Geräts weiterläuft. Durch den Aufruf von date wird diese Uhr allerdings nicht gesetzt. Um die Systemuhrzeit auf diesen Chip zu übernehmen, ruft der Administrator den folgenden Befehl auf:

hwclock --systohc

Regelmäßige Arbeiten: crontab

Jeder Anwender kann sich eine crontab erstellen, die wiederkehrende Arbeiten automatisch zu festgelegten Zeiten startet. Die crontab wird in einer Datei im Verzeichnis /var/spool/cron abgelegt. Da hier aber nur Administratoren etwas verloren haben, wird die crontab mit dem Kommando crontab gepflegt. Im ersten Schritt sollte man prüfen, ob man vielleicht bereits eine eingerichtete crontab besitzt. Dies kann man recht einfach feststellen:

crontab -l

crontab verändern

Gibt man crontab ohne Parameter ein, wartet das Programm, bis man die crontab von der Tastatur direkt eingetippt hat. Man beendet die Eingabe mit ctrl-D abschließen. Es ist allerdings wesentlich entspannender, wenn auch nicht so imposant, wenn man einen Editor verwendet und die crontab zunächst in eine Datei sichert. Anschließend kann man durch Umleitung der Datei in die Eingabe von crontab bequem die Tabelle aufsetzen. Um eine crontab zu aktualisieren, ist der übliche Vorgang, dass man die bisherige crontab in eine Datei umleitet, sie mit einem Editor anpasst und dann als Eingabedatei in den crontab schiebt. Da die Datei anschließend nicht mehr gebraucht wird, kann man sie löschen.

crontab -l > meincrontab
vi meincrontab
crontab < meincrontab
rm meincrontab

Die crontab ist eine Textdatei, in der zunächst in mehreren Spalten das Wiederholungsintervall festgelegt wird. In der letzten Spalte wird das zu startende Kommando eingetragen. Das Beispiel hat der besseren Lesbarkeit halber zu Anfang zwei Kommentarzeilen. Die müssen in der crontab nicht stehen.

# Minute Stunde Tag(Monat) Monat  Tag(Woche)   Kommando
# (0-59) (0-23) (1-31)     (1-12) (1-7; 1=Mo) 
0         4      *          *      *           program1
0         9      1,15       *      *           program2
0         2      *          *      1,2,3,4,5   program3 

Die ersten fünf Spalten beschreiben den Startzeitpunkt und die sechste das auszuführende Kommando. Ein Stern bedeutet, dass die Ausführung stattfindet, egal welchen Wert die Kategorie hat. Eine von Kommata getrennte Zahlenkolonne gibt mehrere Zeiten an. In Beispiel:

Beim Kommando crontab kann mit der Option -u der Benutzer angegeben werden, dessen crontab bearbeitet werden soll. Dabei ist das Verändern fremder crontabs natürlich das Privileg des Superusers.

Zeitversetzter Job: at

Der Befehl at führt ein Kommando zu einem angegebenen Zeitpunkt einmal aus. Als Parameter wird die Uhrzeit angegeben. Anschließend werden zeilenweise die Kommandos eingegeben und durch ctrl-D beendet. Zum Beispiel:

# at 16:00
at>ping comeback
at> ^D
# 

Zeitjobs verwalten

Um 16:00 wird ein ping an den Rechner comeback abgesetzt. Um eine Liste aller abgesetzten at-Befehle anzusehen, gibt es den Befehl atq. In dieser Liste stehen auch Nummern, über die die Befehle wieder mit atrm zu löschen sind.

Sollte im Beispiel 16.00 Uhr bereits überschritten sein, wird der ping erst morgen um diese Zeit ausgeführt. Man kann auch das Datum der Ausführung festlegen. Dieses hat das Format DD.MM oder DD.MM.YY, dabei kann das Jahr auch vierstellig sein. Sehr praktisch ist es auch, dass man eine Zeitdifferenz angeben kann. Das Beispiel wird eine Minute nach Start des Kommandos beginnen.

at now + 1 minute

Diese Seite basiert auf Inhalten aus dem Buch Arnold Willemer: Wie werde ich UNIX-Guru?