Unix kennt mehrere Befehle, die mit der Systemzeit zu tun haben, oder sie direkt nutzen. Die drei wichtigsten Mechanismen werden hier erklärt, wobei es sich nur in einem Fall tatsächlich um ein einfaches Kommando handelt. Die beiden anderen sind eher ganze Subsysteme, die eine genauere Beschreibung erfordern.

date

Der Befehl date ist der normale Weg, wie auf die Systemzeit von Unix zugegriffen werden kann. Er bezieht sich aber immer auf die Systemzeit und nicht auf die CMos-Uhr (RTC Real-Time-Clock).

Als einfachste Form der Anwendung kann date einfach ohne Parameter aufgerufen werden. Dann gibt er die Systemzeit in einem String der Form

Sat Aug 21 14:17:40 MEST 1999

auf die Standard-Ausgabe aus. Das ist aber, gerade für Nicht-Amerikaner, nicht immer die gewünschte Form. Aus diesem Grund bietet date auch die Möglichkeit, eine beliebige Ausgabeform für ein Datum zu erstellen.

Wenn date einen Parameter erhält, der mit einem Pluszeichen (+) beginnt, so interpretiert es die folgende Zeichenkette und ersetzt bestimmte Elemente darin mit den entsprechenden Werten der Systemzeit.

Diese interpretierten Elemente beginnen immer mit einem Prozentzeichen (%) dem ein Buchstabe folgt. So bedeutet etwa das %H die Stunden im 24 Stunden-Modus, %M die Minuten. Wenn wir also nur wissen wollen, wie spät es gerade ist, könnten wir schreiben:

date „+Es ist jetzt %H Uhr und %M Minuten“

Die Anführungszeichen sind nötig, weil in unserer Zeichenkette Leerzeichen enthalten sind. Die Ausgabe des Befehls wäre jetzt etwas in der Art:

Es ist jetzt 14 Uhr und 25 Minuten

Eine genaue Darstellung aller unterstützter Parameter ist in der Handbuchseite aufgeführt.

Der Systemverwalter kann mit dem Befehl date auch die Systemuhr stellen, allerdings wird nur die Systemzeit, nicht die CMos-Zeit verändert. Dazu gibt es zwei Möglichkeiten:

  1. Dem Kommando date folgt ein Parameter in der Form MMDDhhmm, also eine Zeichenkette, deren erste zwei Zeichen die Monatszahl (01-12) enthält, die nächsten zwei den Tag des Monats (01-31), die nächsten die Stunden (00-23) und die letzten die Minuten (00-59). Optional kann die Zeichenkette auch noch eine zwei oder vierstellige Jahreszahl und danach, durch einen Punkt getrennt die Angabe der Sekunden (zweistellig) enthalten. (MMDDhhmmYYYY.ss)
  2. Das Kommando date wird mit dem Schalter -s und einem darauffolgendem Datum der Art „Sat Aug 21 14:17:40 MEST 1999“ aufgerufen. Das macht in der Regel nur dann einen Sinn, wenn vorher das date-Programm benutzt wurde um diese Zeit abzuspeichern, oder wenn ein date eines Rechners benutzt wird, die Uhren anderer Rechner zu stellen.

Damit auch die Hardware-Uhr gestellt wird, gibt es den Befehl clock –systohc, mit dem die CMos-Uhr nach der Systemzeit gestellt wird.

Das at-System

Das at-System besteht aus mehreren Befehlen, die zusammen ein Spool-System ergeben, das die Aufgabe hat, Befehle zu bestimmten Zeiten auszuführen.

Die drei wichtigen Befehle hierzu sind: at Dieser Befehl nimmt Kommandos entgegen, die er zu einer bestimmten Zeit ausführt. Bis diese Zeit erreicht ist, werden diese Befehle in einen Zwischenspeicher (spool-directory) abgelegt. atq Dieser Befehl zeigt einem Normaluser, welche Befehle er selbst im Spoolverzeichnis abgelegt hat und wann diese Befehle ausgeführt werden sollen. Der Superuser (root) bekommt alle Befehle zu sehen, die in dem Spoolverzeichnis abgelegt wurden. atrm Dieser Befehl löscht einzelne Befehle aus dem Spoolverzeichnis, anhand einer anzugebenden Jobnummer. Die Aufrufform der Befehle ist nicht schwierig aber, zumindestens für Nicht-Unixer gewöhnungsbedürftig. at wird aufgerufen, zusammen mit der Uhrzeit, an der der Befehl abgearbeitet werden soll. Dann erwartet at den Befehl bzw. die Befehle von der Standard-Eingabe. Die ist zwar mit der Tastatur verbunden, um diese Eingabe aber zu beenden, muß manuell ein Dateiendezeichen eingegeben werden. Das geschieht mit der Tastenkombination strg-d in einer eigenen Zeile.

# at 14:45
at> rm /tmp/versuchsdatei
at> strg-d
warning: commands will be executed using /bin/sh
job 3 at 1999-08-21 14:45
#

Wichtig ist auch, dass die Befehle, die von at ausgeführt werden, kein Terminal zur Verfügung haben. Alle Ausgaben, die ein Befehl also auf die Standard-Ausgabe machen will, kann nicht einfach in ein Terminal schreiben. Aus diesem Grund werden die Ausgaben der Programme an die User, die den at-Job gestartet haben gemailt.

Wenn eine Uhrzeit angegeben wird, die schon vorbei ist, so wird der Job am nächsten Tag um die angegebene Uhrzeit erledigt. Es ist aber natürlich auch möglich, direkt ein Datum anzugeben, an dem der Job ausgeführt werden soll. Das muß nach der Angabe der Uhrzeit folgen – in der Form MMDDYY oder MM/DD/YY oder europäisch DD.MM.YY.

Daneben gibt es auch noch die Möglichkeit, relativ zur aktuellen Zeit Uhrzeiten anzugeben in der Form

now + n Zeiteinheit

Wobei Zeiteinheit die Werte minutes, hours, days oder weeks annehmen darf.

at now + 15 minutes

Das ganze läßt sich auch noch kombinieren, indem etwa eine Uhrzeit und ein Abstand dazu eingegeben wird wie:

at 15:35 + 4 days

oder gar

at 15:35 tomorrow

Für die ganz zahlenfeindlichen gibt es noch die Werte midnight, noon oder teatime (16:00) so dass es sogar geht, mit

at teatime tomorrow

einen Befehl einzugeben.

Jeder at-Job hat eine Jobnummer, die ihn eindeutig adressiert. Um zu sehen, welche Jobs mit welchen Jobnummern noch zur Ausführung anstehen, gibt es den Befehl atq. Er gibt aus, welcher Job (JobNR) zu welcher Zeit ausgeführt werden soll.

Um einen at-Job aus dem Spoolverzeichnis zu löschen und damit zu verhindern, dass er ausgeführt wird, gibt es den Befehl atrm. Ihm wird die Jobnummer des Jobs mitgegeben, der gelöscht werden soll.

Damit ds ganze at-System überhaupt funktioniert, gibt es den at-Daemon (atd), der die Ausführung der Jobs dann übernimmt. Dieser Daemon läuft dauernd im Hintergrund und überprüft ständig die Spoolverzeichnisse und die Systemzeit. Hat er einenJob gefunden, und ist es gerade die Zeit in der er ausgeführt werden soll, so wird der Job vom at-Daemon gestartet.

Der Cron-Daemon

Neben den Jobs, die zeitabhängig ein einziges Mal durchgeführt werden sollen, gibt es die immer wiederkehrenden Aufgaben. Dazu ist at denkbar schlecht geeignet, für diese Aufgabe gibt es den cron-Daemon.

Der Cron-Daemon arbeitet mit den sogenannten cron-Tabellen oder engl. crontabs. In diesen Tabellen stehen die Jobs, die zu bestimmten Tagen, Wochentagen oder Uhrzeiten abgearbeitet werden sollen. Jeer User kann seine eigene cron-Tabelle haben, die seine persönlichen Jobs beinhaltet, in der Regel arbeiten aber meistens die Systemverwalter mit diesen Tabellen.

Die Form, in der eine Cron-Tabelle aufgebaut ist, sieht folgendermaßen aus:

Minute Stunde Tag Monat Tag_der_Woche       Kommando

Dabei gelten die folgenden Bereiche:

Minute0-59
Stunde0-23
Tag0-31
Monat1-12
Tag_der_Woche0-7 (0 und 7 bedeutet Sonntag)

Wenn ein Sternchen für einen Wert steht, so bedeutet er jeden beliebigen Wert. Jedes Feld kann auch Bereiche annehmen. Steht etwa im Feld Stunde 8-11, dann bedeutet das 8,9,10,11. Es können auch in jedem Feld mehrere Werte, mit Komma getrennt angegeben werden (z.B. 8,10,12,14).

Das Kommando wird vom Cron-Daemon ausgeführt, wenn die Minute, Stunde und Monatsfelder mit der Systemzeit übereinstimmen und mindestens eines der Felder Tag bzw. Tag_der_Woche passen.

Einen Eintrag in seinem crontab kann man am Besten mit dem Befehl crontab -e erstellen. Dieser Befehl ruft den Editor auf, der in der Umgebungsvariable VISUAL oder EDITOR genannt ist, ansonsten den vi.

Typische Beispiele für Crontab-Einträge wären

35 17 * * 5 /root/bin/backup

ruft jeden Freitag um 17 Uhr 35 das Programm /root/bin/backup auf.

Oder etwa

0 * * * * wavplay /usr/share/sounds/wav/kukuck.wav

Gibt zu jeder vollen Stunde (Minutenfeld auf 0) über die Soundkarte ein Kukuck aus…