Zeit-Steuerung @ Linux

Systemzeit und Zeit-gesteuerte Aufträge

Linux bietet sehr flexible Möglichkeiten zur Arbeit mit Datum und Zeit. Eine spezielle Aufgabe ist die automatische Auslösung von Jobs zu vorbestimmten Zeiten.
Linux Das professionelle OpenSource Betriebssystem
LAMP Standard-Server mit Linux - Apache - MySQL - PHP - Samba
Ausgabe von Datum und Zeit
Eingabe von Datum und Zeit
Kalender Mini-Anzeige des aktuellen Monats-Kalenders
Script Definition des Jobs in einem Script
Einmalig Einmalige Ausführung zu einer vorbestimmten Zeit - at
Zugangsrechte zum at-Befehl für alle (zugelassenen) user
Wiederholt Periodisch wiederholte Ausführung - cron
Persönliche crontab für alle (zugelassenen) User
Zeitzone Eingabe, Ausgabe und Umgebungs-Variable
Jiffy Interne Verwaltung der Systemzeit mit Interrupts
Verwandte Themen:
Kalender & Zeit Spezielle Aspekte der Informationstechnik
Windows & Zeit Zeit-Steuerung auf Windows (+ Cygwin)
NTP-Server Network Time Protocol zur Zeit-Synchronisation
UNIX-Timestamp Zeitmarke zur Speicherung von Datum und Zeit
Linux-Umgebung Umgebungs-Variable: Analyse, Definition, Änderung

Ausgabe von Datum und Zeit

Hardware-Uhr

Jeder gängige PC verfügt über (mindestens) 2 verschiedene Uhren:
Die Hardware-Uhr läuft auf einem eigenen, dafür spezialisierten Chip. Sie dient zur Überbrückung des abgeschalteten (stromlosen) Zustands, benötigt sehr wenig Energie und wird aus Akkus und/oder langlebigen Batterien gespeist.

Software-Uhr

Diese Uhr ist ein kleines Programm, das vom Betriebssystem periodisch aufgerufen wird. Die Uhr wird beim System-Start mit der Hardware-Uhr synchronisiert.
Alle 'normalen' Zeit-Anfragen werden an diese Uhr gerichtet.
Die Software-Uhr läuft oft genauer als die Hardware-Uhr, da sie u.a. auch Abweichungen kompensieren kann.

Datum und Zeit lesen

Sie können System-Datum und Zeit auf der Konsole ausgeben und dazu viele verschiedene Formate verwenden.
Hier wird jeweils der Befehl und anschließend sein Ergebnis gezeigt (ohne Gewähr !)

Details zeigen die Konsolen-Befehle
# man date
# info date

Datum und Lokalzeit ohne Argument im Format RFC822 mit Text-Angabe der Zeitzone.
# date
Day Mon 01 12:34:56 CET 2000
Standard → ISO 8601 Format: Datum oder Variante mit Zeit und Offset (Abstand von der Weltzeit UTC)
# date --iso-8601
2000-01-01
# date --iso-8601='seconds'
2000-01-01T12:34:56+0100

Format RFC-822: Weltzeit UTC oder Lokalzeit und Offset (Abstand von der Weltzeit UTC)
# date --utc
Day Mon 01 11:34:56 UTC 2000
# date --rfc-822
Day, 01 Mon 2000 12:34:56 +0100

Formatierung mit POSIX-Funktion strftime

Datum und Zeit können mit Hilfe eines Format-Strings fast beliebig formatiert werden. Der String wird nach dem POSIX-Standard (Funktion strftime ) formuliert:

UNIX-Timestamp (Sekunden seit 1970-01-01 ):
# date "+%s"
1234567890

Zeitzone - Name und Offset (Abstand von der Weltzeit UTC) in Stunden (2 verschiedene Formate)
# date "+%Z %z %:z"
CET +0100 +01:00
Das gibt u.a. die Möglichkeit, mit Programmen beliebiger Programmiersprachen die aktuelle Differenz Zonenzeit-Weltzeit festzustellen.

Hilfe und Details mit
# man date
# info date
Ausgabe im Standard-Format → ISO 8601:
Standard Datum und Zeit
# date "+%F %T"
2000-01-01 12:34:56
Datum
# date "+%F"
# date "+%Y-%m-%d"
2000-01-01
Zeit
# date "+%T"
# date "+%H:%M:%S"
12:34:56
Wochentags-Nummer (Mo→1..So→7)
# date "+%u"
0
Tag des Jahres
# date "+%Y-%j"
2000-123
Das kleine Script rechts zeigt die Weiter-Verarbeitung der date-Daten
An eine Text-Datei ausgeben (1.Zeile), an eine Text-Datei anhängen (2. Zeile), oder an eine Variable übergeben (3.Zeile):
In diesem Beispiel wird ein neues Verzeichnis mit einem "programmiertem Namen" erzeugt.
Mit "double quotes" wird der String selbst an eine Variable zugewiesen, mit `backticks` das Ergebnis des (date)-Befehls.
# date "+%Y%m%d%H%M%S" > test.txt
# date "+%Y%m%d%H%M%S" >> test.txt
# var1 = `date"+%Y%m%d%H%M"`
# echo "var1 = $var1"
# mkdir /home/test/d$var1
würde jetzt dieses Verzeichnis erzeugen
/home/test/d_20000101123456

Pause

Die Anweisung pause hält ein → Shell-Script-Programm für die als Argument angegebene Anzahl von Sekunden an. Man kann sie u.a. dazu verwenden, um nach einer Anweisung die Ausführung abzuwarten (z.B. Start oder Stop eines Server-Programms) und danach die Wirkung anzuzeigen.
Demo-Programm, z.B. als Text-Datei pause.sh
#!/bin/sh
date "+%F %T"
pause 3
date "+%F %T"

Hardware-Uhr

Linux erlaubt auch die direkte Ablesung der Hardware-Uhr eines PC mit dem Befehl hwclock
Das Beispiel zeigt die Ausgabe in Lokalzeit und in Weltzeit UTC im chaotischen RFC-Format. Zuletzt werden die Sekunden-Bruchteile angegeben.
Details zum Befehl hwclock erhalten sie mit
# man hwclock
Anzeige der Hardware-Uhr:
# hwclock --show
Day Mon 01 12:34:56 2000 -0.123 seconds
# hwclock --show --utc
Day Mon 01 11:34:58 2000 -0.567 seconds

Dokumentation auf Linux

(Navigation mit den Pfeil-Tasten, Ende mit Taste q )
# man date
# info coreutils 'date invocation'
Cygwin Cygwin bietet die Möglichkeit, die professionellen Linux Shell-Programme auch auf Windows zu verwenden.
Mit Cygwin lassen sich u.a. zahlreiche auf Windows schmerzlich fehlende → Datum & Zeit-Funktionen installieren.

Eingabe von Datum und Zeit

root

Die Einstellung der Systemzeit erfordert Administrator-Rechte.
Sie müssen normalerweise als root angemeldet sein, um diese Befehle auszuführen.
Meist müssen sie - wenn überhaupt - nur die Zeit einstellen:
Verwenden sie dazu solche Strings, je nach Genauigkeit:
set=hh:mi:ss
Die Änderung von Datum und Zeit auf Linux erfordert die entsprechenden Zugriffsrechte !   (normalerweise root )
Einstellung der Zeit (Stunden, +Minuten, +Sekunden):
# date --set=12
# date --set=12:34
# date --set=12:34:56
Zur Eingabe des Datums verwenden sie ein anderes Format:
MODDhhmi
MODDhhmiYYYY
MODDhhmiYYYY.ss
Das chaotische Format richtet sich nach der Häufigkeit der verwendeten Daten: Meist genügt die erste Version.
Einstellung von Datum
# date 01011234
# date 010112342000
# date 010112342000.56

Hardware-Uhr

Linux erlaubt auch die direkte Einstellung der Hardware-Uhr eines PC mit dem Befehl hwclock - Das wird allerdings nicht empfohlen ! Besser als eine einmalige manuelle Einstellung ist die regelmäßige automatisch Aktualisierung mit → NTP.

So wird die Software-Uhr (bei Systemstart) automatisch von der Hardware-Uhr synchronisiert (Lesen sie vorher das Manual !)
# hwclock --hctosys

Manuelle Einstellung:
Setzen sie mit Befehl date die Software-Systemzeit, kontrollieren sie diese, synchronisieren sie danach die Hardware-Uhr mit
# hwclock --systohc

Die Hardware-Uhr kann in der Weltzeit UTC geführt werden, unabhängig von der Einstellung von Zeitzone und Software-Uhr.
Details zum Befehl hwclock liefert. (Navigation mit den Pfeil-Tasten, Ende mit Taste q )
# man hwclock
# man date
# info coreutils 'date invocation'
Das Betriebssystem verwendet selbst das Programm hwclock, um die (Software)-Systemzeit nach dem Hochfahren auf die Hardware-Uhr einzustellen. Dazu wird dieses Script verwendet
/etc/sysconfig/clock
Änderungen dieser Datei sind nicht sinnvoll, da System-Scripts bei Änderung der Software-Installation oder bei einem System-Update überschrieben werden.

Eigene Scripts erstellen sie besser in einem anderen Verzeichnis.
Beachten sie die Optionen zur Synchronisation: Wenn die Software-Uhr genauer läuft, dann wird die Hardware-Uhr beim Herunterfahren des Systems (shutdown) mit der Software-Uhr synchronisiert.
Server laufen lange Zeit ungestört. In diesem Fall treten die Ereignisse System-Start und System-Stop zu selten auf. Server werden daher periodisch (z.B. täglich) mit → NTP mit einem externen Zeitserver synchronisiert.

Konfiguration der Uhr

In diesem Pfad befindet sich (bei SuSE Linux) eine Text-Datei zur Konfiguration der System-Uhr:
/etc/sysconfig/clock

Die Datei ist mit Kommentaren gut dokumentiert. Die Standard-Konfiguration ist sinnvoll und sollte nur dann geändert werden, wenn wichtige Argumente dafür sprechen.

Kalender

Befehl cal zeigt einen Mini-Kalender des aktuellen Monats an.

Option m beginnt die Woche mit Montag
Option 3 zeigt 3 Monate an
Option y zeigt 1 Jahr an.

Mit cal monat jahr kann man Kalender für andere Daten anzeigen.
Kalender anzeigen:
# cal -m

Warning: exec() has been disabled for security reasons in /home/topsoft.at/www.topsoft.at/pstrainer/system/betriebssystem/linux/cron_linux.php on line 696
     

Definition eines Jobs durch ein Script

Wenn sie planen, einen Job zeitgesteuert zu starten, dann erstellen sie dafür am besten ein eigenes Script:
Beispiel: In der Textdatei (Muster rechts)
/home/test/testjob
wird ein Job definiert: Damit wird zur Ausführungszeit ein Verzeichnis des Namens
/home/test/testYYYYMMDDhhmm
erstellt, in dessen Name Datum und Zeit enthalten sind - so ist leicht zu kontrollieren, ob und wann der Job tatsächlich ausgeführt wurde.
Inhalt der Text-Datei /home/test/testjob.sh

#!bin/sh
# file hone/test/testjob.sh
var1 = `date"+%Y%m%d%H%M"`
mkdir /home/test/d$var1
# eof testjob

Manueller Test

Testen und Debuggen sie ihr Script durch manuellen Start. Verwenden sie nur absolute Pfade für Verzeichnisse und Dateien.
Manueller Start des Scripts an der Shell-Konsole:
# /home/test/testjob.sh

Test mit cron

Testen sie, ob ihr Script auch beim automatischem Start funktioniert - In diesem Fall stehen nur wenige → Umgebungs-Variable zur Verfügung.
Mit der gezeigten Auftrags-Zeile wird zu jeder vollen Stunde das Script-Programm testjob.sh im Namen und mit den Rechten des Administrators root gestartet.
Details zum Cron-Server und zu Umgebungs-Variablen (Analyse, Simulation, Ergänzung)

Datei /etc/crontab
Neue Text-Zeile anhängen:
0 */1 * * * root /home/test/testjob.sh

Einmalige Ausführung zu einer vorbestimmten Zeit - at

at-Demon

Zunächst muss sichergestellt werden, dass der at-Demon läuft:
Falls der Demon (Server, Dienstprogramm) nicht läuft, wird er gestartet:
SuSE bietet dazu das hier gezeigte Script
/etc/init.d/atd
Das Programm selbst liegt (z.B.) hier
/usr/sbin/atd
Dokumentation:
# man atd
Eine Frage nach dem status oder die Wiederholung der Prozessliste zeigt den Erfolg des Startbefehls.
Manuelle Kontrolle (und Start) des at-Demon
# ps -A | grep atd
...
# /etc/init.d/at start
# /etc/init.d/at status
...
# ps -A | grep atd

Aufträge

Jobs müssen vor Beauftragung des atd als → Scripts formuliert werden !
Der at-Demon erhält seine Aufträge meist direkt von der Konsole:

Standard-Variante: ohne Datum gilt der aktuelle oder der nächste Tag.
Variante mit Datum: Geben sie zuerst die Zeit, dann das Datum (MM/DD/YY oder DD.MM.YY) an.
Für die absolute und relative Angabe von Datum und Zeit sind zahlreiche (englische) Abkürzungen möglich (Hilfe mit man at )
Schließen sie die Jobliste mit <Strg>-d. (erzeugt <EOT> )
Nach Abschluss wird die Liste der soeben beauftragten Jobs (mit laufender at-Jobnummer) ausgegeben.
Auftrag ohne Datum:
# at 12:34
Warning: commands will be executed using bin/sh
at> /home/test/testjob1
at> <EOT>
job 1 at 2004-05-06 12:34
Auftrag mit Datum:
# at 12:34 12.03.04
Warning: commands will be executed using bin/sh
at> /home/test/testjob2
at> <EOT>
job 2 at 2004-03-04 12:34
Eine Liste aller wartenden Jobs erhalten Sie mit atq.
In der ersten Spalte wird die laufende at-Jobnummer angeführt.
# atq
1 2004-05-06 12:34 root
2 2004-05-06 12:34 root
Anweisung atrm (at remove) löscht einen Job aus der Warteliste. Geben sie dazu die at-Jobnummer an (z.B. aus der atq-Liste). Eine nachfolgende Kontrolle mit atq zeigt den Erfolg des Befehls.
# atrm 2
# atq
1 2004-05-06 12:34 root

"Wenn Zeit dafür ist": batch

Befehl batch beauftragt einen Job zur Ausführung, sobald die Systemlast <80% beträgt. (Eine andere Auslastung kann definiert werden).
# batch
Warning: commands will be executed using bin/sh
at> /home/test/testjob
at> <EOT>
job 3 at 2004-03-04 12:34
Der at-Befehl steht nur dem User root immer zur Verfügung. Die Zugangsrechte für ↓ alle anderen berechtigten User werden getrennt eingestellt.

at für berechtigte User

Alle unter at genannten Möglichkeiten zur Steuerung stehen nur dem root-Administrator immer zur Verfügung.
Die Rechte für den at-Befehl werden durch die Dateien at.allow oder at.deny geregelt.
Tragen sie in diese Dateien user-Namen ein, und zwar 1 je Zeile.
Wenn at.allow existiert, dann muss jeder user darin eingetragen sein, um at zu benutzen.
Wenn at.allow nicht existiert, jedoch at.deny, dann dürfen alle user at benutzen, die nicht in at.deny eingetragen sind.
Wenn weder at.allow noch at.deny existiert, hat nur root Zugriff auf at.

Konfiguration der at-Rechte:
/etc/at.allow
/etc/at.deny

Periodisch wiederholte Ausführung - cron

Der cron-Demon (Server) ist in jeder Linux-Distribution installiert und gestartet. Er kontrolliert in jeder Minute einmal, ob auszuführende Jobs vorliegen. Es gibt verschiedene Möglichkeiten, einen cron-Job in Auftrag zu geben:

System-crontab

In der Datei /etc/crontab sind die cron-Jobs des Betriebssystems nach einer speziellen Syntax gelistet. Diese Datei darf nur durch den SuperUser root beschreibbar sein.

Hier sind normalerweise einige Systemjobs eingetragen, die man besser nicht verändert.
In der Zeile # Syntax finden sie die 'Grammatik' eigener Einträge (die am besten am Ende der Datei angefügt werden):

Die Reihenfolge der Datum- und Zeit-Angaben ist gewöhnungsbedürftig:
Je ein Eintrag für Minuten (0..59), Stunden (0..23), Tag (des Monats, 1..31), Monat (1..12), → Wochentag (0So..6Sa), User und Befehl;
Als Trennzeichen dienen blank (Leerzeichen) oder tab (Tabulator).
Der * Stern ist ein Joker für alle Werte.
Man muss alle Teile der Befehlszeile angeben und darf nichts weglassen.

cron reagiert sofort (nach max 1 min) auf jede Änderung der crontab, und braucht nicht neu gestartet werden.

# Kommentare nur in eigene Zeilen !
Muster der Text-Datei crontab:

# file /etc/crontab
# ...
# Syntax: min std tag monat wotag user befehl
# täglich zu jeder vollen Stunde

0 * * * * root /home/ich/test
# täglich von 09:30 bis 16:30 zu jeder halben Stunde
30 9-16 * * * root /home/test/testjob
# an jedem Monatsersten um 08:15
15 8 1 * * root /home/ich/test
# an jedem Freitag, 13. um 13:13
13 13 13 * 5 root /home/test/testjob
# heute um 09:00, 12:00 und 15:00
0 9,12,15 25 3 * root /home/ich/test
# am 24.Dezember um 12:34
34 12 24 12 * root /home/ich/test

cron-Verzeichnisse

Der cron-Demon durchsucht automatisch die rechts angezeigten Verzeichnisse und führt alle darin enthaltenen Scripts aus. Wenn sie ein Script z.B. nach /etc/cron.daily kopieren, dann wird es "täglich" einmal automatisch ausgeführt, normalerweise ca. 15 Minuten nach System-Start (↓ konfigurierbar). In diesem Fall wird der Job nicht in /etc/crontab eingetragen.
cron reagiert sofort auf jede Änderung im Inhalt der cron-Verzeichnisse.
Es ist übersichtlicher, wenn es von einem Programm nur eine einzige "gültige" Kopie gibt. Daher legt man im cron-Verzeichnis keine zusätzliche Kopie an, sondern besser einen Link (Alias, Verweis) auf das Original.

/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/

cron-Link zu einem Script-Programm anlegen:
# ln -s /home/ich/test.pl /etc/cron.daily/ich_test

Ausführungs-Rechte

Je nach Konfiguration gelten unterschiedliche Regeln für die Zulassung eines cron-Jobs:
Wenn die Datei cron.allow existiert, dann muss der eingetragene User darin ausdrücklich angeführt werden.
Wenn die Datei cron.deny existiert, dann darf der User darin nicht eingetragen sein.
Wenn keine der beiden Dateien existiert, dann darf nur der SuperUser root den Job ausführen.

Wenn mit cron ein Script-Programm ausgeführt werden soll, dann muss der angegebene User natürlich auch das Recht dazu haben bzw. muss das Programm als executable markiert sein.

cron.d Verzeichnis

Der cron-Demon durchsucht auch dieses Verzeichnis, erwartet darin jedoch keine ausführbaren Scripts, sondern weitere Steuerdateien, in welchen cron-Jobs nach der oben erwähnten crontab-Syntax eingetragen sind.

/etc/cron.d/

Umgebung

Wenn ein Programm mit cron gestartet wird, erhält es aus Sicherheits-Gründen nur wenige → Umgebungs-Variable - viel weniger als bei manuellem Start an einer Konsole.
Das führt oft zu Problemen.

Ein mit cron gestartetes Programm sollte normalerweise keinen Ausgabe-Text an die Konsole senden. Daher ist es schwierig, allfällige (in diesem Fall: häufige) Fehler zu finden und zu beheben.

Es ist für wenig geübte EntwicklerInnen besonders schwierig, Programme herzustellen, die sich mit cron automatisch starten lassen.

Auf der Seite → Linux Umgebungs-Daten werden dazu Beispiele, Test-Programme und Tipps vorgestellt.

System-Vorgaben

In diesem Pfad befindet sich (bei SuSE Linux) eine Text-Datei zur cron-Konfiguration:
/etc/sysconfig/cron

Die Datei ist mit Kommentaren gut dokumentiert. Die Standard-Konfiguration ist sinnvoll und sollte nur dann geändert werden, wenn wichtige Argumente dafür sprechen.

Alternativen

anachron und fchron bieten Ergänzungen bzw. Erweiterungen, insbesondere für Arbeits-PC, die täglich ein- und ausgeschaltet werden: Sie holen diverse Routine-Aufgaben nach dem Hochfahren nach.

Server-Rettung

Server-PC befinden sich oft in entfernten, versperrten Räumen und sind dann schwer zugänglich. Wenn ein derartiger Server außer Kontrolle gerät, dann ist es vorteilhaft, eine Möglichkeit zur Reparatur auch ohne direkten Zugang zu haben.

Die Voraussetzungen dazu sind meistens erfüllt::
Das Server-Betriebssystem läuft noch und ist nicht abgestürzt
Der Cron-Dienst funktioniert.
Mindestens einer dieser Dienste funktioniert, mit dem sich eine Datei auf den Server kopieren lässt: SSH, FTP, Fileserver (NFS, Samba).

Mit etwas Glück ist es möglich, ein kleines Script-Programm auf den Server zu kopieren, mit dessen Hilfe der PC mindestens so weit gebracht wird, dass eine Reparatur wieder möglich ist:

Der Cron-Dienst wird bei der Vorbereitung angewiesen, ein bestimmtes Script zu fixen Zeiten (z.B. täglich um Mitternacht) asuzuführen. Unter normalen Umständen enthält dieses Script keine Anweisungen. Im Notfall kann man es durch ein Script ersetzen, welches die gewünschten Anweisungen enthält, z.B. zum Beenden bestimmter Prozesse oder für einen Neustart des Servers.

Persönliche crontab für berechtigte User

crontab-Berechtigung:

Alle unter cron genannten Möglichkeiten zur Steuerung stehen nur dem root-Administrator zur Verfügung.
Die Rechte für den crontab-Befehl werden durch die Dateien allow oder deny geregelt (in anderen Versionen cron.allow und cron.deny).
Tragen sie in diese Dateien user-Namen ein, und zwar 1 je Zeile.
Wenn allow existiert, dann muss jeder user darin eingetragen sein, um crontab zu benutzen.
Wenn allow nicht existiert, jedoch deny, dann dürfen alle user crontab benutzen, die nicht in deny eingetragen sind.
Wenn weder allow noch deny existiert, hat nur root Zugriff auf cron.

Je nach Version werden verschiedene Dateien verwendet:
/var/spool/cron/allow
/var/spool/cron/deny
oder
/var/spool/cron.allow
/var/spool/cron.deny
Die Dateien der user-crontabs werden normalerweise ebenfalls hier gespeichert.

crontab-Befehl:

Wenn ein user die ↑ crontab-Berechtigung hat, dann kann sie/er den Befehl verwenden und damit eine eigene persönliche crontab-Tabelle verwalten.
Mit Option (-l) wird die persönliche crontab-Liste angezeigt.
Mit Option (-e) wird eine neue persönliche crontab erstellt oder eine bestehende editiert. Dazu wird meist der Editorvibenutzt (siehe unten).
Die Syntax ist gleich wie oben für die System-crontab beschrieben, jedoch ohne das user-Feld.
Beim Speichern wird die Syntax überprüft: Bei Fehler erhalten sie eine Meldung und können nochmals editieren. Nur wenn die Syntax ok ist, wird die crontab gespeichert. Testen sie anschließend durch Anzeige der crontab mit (-l).
Option (-r) löscht eine crontab

Deteils erhält man mit dem Konsolen-Befehl
# man crontab
Anzeige der persönlichen crontab (alle user) bzw.
Anzeige einer user-crontab (nur root):
# crontab -l
# crontab -u username -l
Erstellen / Editieren einer persönlichen crontab:
# crontab -e
Löschen der persönlichen crontab
# crontab -r

Der Text-Editor vi

stammt noch aus der Konsolen-Zeit und ist für BenutzerInnen heute üblicher Editoren ungewohnt.
Hier eine Mikro-Anleitung nur für die Erstellung der crontab:
Sie sehen anfangs eine "leere" Datei.
Anweisung :i wechselt in den INSERT-Mode (wird unten angezeigt.
Im INSERT-Mode kann man Text eingeben, dort funktioniert auch die Löschtaste. Bereits gespeicherten Text (:w) ändert man entweder durch ein neues INSERT oder durch Löschen (:x.).
Mit den Pfeiltasten kann man navigieren.
Mit esc-Taste gelangt man in den Befehls-Mode (und wieder zurück)
Befehl :w oder :write speichert die Datei
Befehl :help öffnet das Hilfe-Fenster, das man mit Befehl :q wieder verlassen kann.
Befehl :x löscht ein Zeichen (nach rechts), :nx löscht n Zeichen, z.B. :3x löscht 3 Zeichen rechts vom Cursor.
Befehl :q oder :quit beendet den Editor.

Manual von vi:
# man vi
oder bei gestartetem vi: <F1>
oder im Befehlsmodus :help

Erstellen / Editieren einer persönlichen crontab:
# crontab -e
Beispiel für vi-Befehle:
i
0 12 * * * /home/test/testjob1
0 9 1 * * /home/test/testjob2
esc
:w
:q

VI-Homepage: http://www.vim.org/

Zeitzone

Die System-Zeitzone wird schon bei Installation eingestellt. Je nach System und Version kann man sie nachträglich ändern. Auf SuSE-Linux erfolgt diese Einstellung mit YAST | System | Datum und Zeit. Debian-Linux (Ubuntu) bietet dazu das Programm tzsetup

Zeitzonen-Datenbank

Linux-Systeme enthalten Zeitzonen-Daten (die 'Olson Timezone Database') im Verzeichnis
/usr/share/zoneinfo
Die Unter-Verzeichnisse (z.B. Europe ) entsprechen der Region. In jedem Regions-Verzeichnis befinden sich Binär-Dateien mit den Daten einer Stadt (z.B. Berlin, Vienna, Zurich ).
Die Dateien enthalten u.a. Angaben zu timezone-offset (Differenz zur Weltzeit in Stunden), zur Sommerzeit und zur Geschichte (historische Änderungen von timezone-offset und Sommerzeit-Regeln).
Die Angabe der Zeitzone erfolgt in der Form Region/Stadt
Dieser Text wird von Programmen dazu verwendet, die gesuchten Zeitzonen-Daten aus der betreffenden Datei zu lesen (Lookup).

Beispiele:
Mitteleuropäische Zeit wird z.B. gesetzt mit Europe/Berlin, Europe/Zurich, Europe/Vienna, Osteuropäische Zeit mit Europe/Athens oder Westeuropäische Zeit (im Winter-Halbjahr = Weltzeit) mit Europe/London
In manchen Systemen ist für Europe/Zurich alternativ oder zusätzlich Europe/Bern angegeben.

Die Zeitzone des Systems wird hier festgelegt:
/etc/localtime
Das Objekt ist entweder die Kopie einer Binärdatei aus der Zeitzonen-Datenbank oder ein Link dorthin, z.B.
ln -sf ../usr/share/zoneinfo/Europe/Vienna /etc/localtime

Anzeige mit date

Mit Befehl date und Format-String %z wird der Offset der am System eingestellten Zeitzone (Abstand zur Weltzeit UTC) in Stunden angegeben. Das Ergebnis ist für Mitteleuropäische Zeit (CET, MEZ) +0100 oder bei Sommerzeit +0200
Verwenden sie im Zweifel immer die Angabe des timezone-offset: Sie ist weltweit eindeutig und im Gegensatz zum Namen der Zeitzone unmissverständlich.

Ausgabe des Timezone Offset in Stunden
# date "+%z"
+0100

Umgebungs-Variable TZ

Manche Programme (z.B. Apache / PHP) erwarten eine Umgebungs-Variable TZ mit Angabe der Zeitzone in der Form Region/Stadt
Das Beispiel zeigt, wie eine Umgebungs-Variable einmalig oder dauerhaft gesetzt wird.

Mitteleuropäische Zeit wird z.B. gesetzt mit Europe/Berlin, Europe/Vienna, Europe/Zurich, Osteuropäische Zeit mit Europe/Athens oder Westeuropäische Zeit (im Winter-Halbjahr = Weltzeit) mit Europe/London

Ausgabe der Umgebungs-Variablen TZ mit PHP. So stellen sie fest, ob die Umgebungs-Variable gesetzt und von PHP erkannt wurde:
<?php
print 'TZ='.getenv('TZ')."<br />\n";
?>

Beim Hochfahren definiert das System die wichtigsten → Umgebungs-Variablen mit dieser Datei:
/etc/profile
Eine Änderung dieser Datei ist jedoch nicht empfehlenswert, da sie bei Software-Änderungen und bei jedem System-Update überschrieben wird.

Erstellen sie eine eigene Datei
/etc/profile.local
und fügen sie am Ende diese Zeile ein:
export TZ="Europe/Vienna"
Nach System-Neustart ist TZ für alle Prozesse verfügbar.

Details zu Umgebungs-Variablen

Umgebungs-Variable TZOH

Mit Hilfe der Umgebungs-Variablen TZ kann jedes Programm die Zeit-Daten der Zone aus der bezeichneten Datei in /usr/share/zoneinfo lesen.
Das ist für einfache Programme allerdings recht aufwändig.

Es ist praktischer, wenn das Betriebssystem eine → Umgebungs-Variable TZOH definiert, welche die aktuelle Differenz der LokalZeit zur Weltzeit UTC in Stunden als ganze Zahl angibt: Diese beträgt in Mitteleuropa bei Normalzeit TZOH=1, bei Sommerzeit TZOH=2

Eine Möglichkeit zur Lösung ist die Verwendung von date zur Ausgabe der Lokal-Stunden und UTC-Stunden als 2stellige ganze Zahlen:
# date "+%H"
# date -u "+%H"

Die Berechnung der Differenz erfordert mit den Mitteln der Konsole etwas Akrobatik:
# echo $(($(date "+%H")-$(date -u "+%H")))
Das funktioniert, ergibt jedoch einen schwer verständlichen Fehler, wenn eine der beiden Zahlen im Bereich 8..9 liegt: In diesem Fall wird die führende Null als Ankündigung einer Octal-Zahl verstanden, und in diesem Zahlen-System gibt es keine Ziffern >7

Dezimal-Trick:
# echo $((1$(date "+%H")-1$(date -u "+%H")))
Vor der arithmetischen Rechnung wird je eine Ziffer 1 vorangestellt: Damit wird immer dezimal gerechnet, und der zusätzliche Wert von +100 fällt bei Berechnung der Differenz weg.

Um TZOH an einem Arbeits-PC aktuell zu halten, genügt es, diese Zeile in die Datei /etc/profile.local einzufügen:
declare -x TZOH=$((1$(date "+%H")-1$(date -u "+%H")))
Das ergibt Live diese Anweisung:
declare -x TZOH=2

Etwas schwieriger ist es diese Umgebungs-Variable an einem Server-PC einzurichten, weil dieser normalerweise längere Zeit (Wochen...Monate) ohne Neustart läuft.
Details und Lösungs-Vorschläge auf der seite zu den Linux Umgebungs-Variablen

Jiffy

Hardware-Uhr

Jeder moderne PC enthält eine PC-lesbare Uhr als Hardware-Baustein. Es handelt sich um einen quarz-stabilisierten Oszillator mit einem angeschlossenen Zähler zur Frequenz-Teilung. Der Chip wird von einer eigenen Batterie oder einem kleinen Akku versorgt auch läuft auch im abgeschalteten PC weiter.

Beim System-Start wird die PC-Zeit von der Uhr gelesen und danach hauptsächlich von der Software des Betriebssystems weiter verwaltet.
Die ersten PC enthielten allerdings noch keine Uhr: Es war notwendig und selbstverständlich, nach dem PC-Start das aktuelle Datum und die Zeit an der Konsole einzugeben.

Interrupt

PC-intern wird die Zeitmessung durch Interrupts gesteuert.
Ein Interrupt ist ein Signal (Interrupt Request, IRQ) auf einer der (Hardware)-Interrupt-Leitungen des Prozessors.

Jeder Interrupt-Leitung ist ein Pointer zugeordnet, welcher auf die Adresse eines im Speicher geladenen Programms zeigt (Interrupt Service Routine ISR oder -Handler).

Wenn auf einer Interrupt-Leitung ein Signal eintrifft, dann unterbricht der Prozessor die laufende Arbeit und startet das für die jeweilige Leitung zuständige ↓ Interrupt-Handler Programm.
Beispiel: Zur Verwaltung der laufenden Zeit wird durch einen Hardware-Baustein in regelmäßigen Intervallen ein Interrupt ausgelöst.

Interrupt-Handler Programm

(Interrupt Service Routine, ISR)
Ein ISR Handler führt jene Arbeiten aus, die als Reaktion auf einen bestimmten (dringenden) Interrupt vorgesehen sind. Dieses Programm muss rasch verfügbar sein und ist daher stets im Speicher geladen.
ISR-Programme müssen extrem rasch laufen und sich selbst so bald wie möglich beenden. Sie sind daher in der Maschinensprache (Assembler) des jeweiligen Prozessors verfasst.

Vor Beginn der Arbeit speichert (PUSH) das ISR den aktuellen Zustand des Prozessors (den Inhalt der Register) auf dem Stack. (Stack = schneller Zwischen-Speicher jedes Prozessors)

Danach beginnt die für das jeweilige Interrupt-Ereignis Vorgesehene Arbeit. Da Interrupts relativ häufig auftreten und die Arbeit aller anderen AnwenderInnen und Dienst-Programme unterbrechen, werden nur sehr wichtige und dringende Arbeiten ausgeführt, deren Anweisungen sich bereits im Speicher befinden. Wenn umfangreiche Arbeiten notwendig sind, dann startet der ISR-Handler dazu ein 'gewöhnliches' Programm (z.B. von einer Festplatte).
Während der Arbeit eines ISR-Handlers wird normalerweise kein weiterer Interrupt der betreffenden Leitung angenommen.
Der Timer-Interrupt kontrolliert z.B., ob die Wartezeit (Timeout) für einen wartenden bzw. zu startenden Prozess abgelaufen ist.
Nach Abschluss der Arbeit regeneriert (POP) der ISR-Handler den Zustand des Prozessors, d.h. er ladet alle Register mit den am Stack gespeicherten Daten.

Danach setzt der Prozessor seine unterbrochene Arbeit fort.

Einer der Interrupts hat eine Sonderstellung: Der Non-Maskable Interrupt (NMI) wird nur bei katastrophalen Ereignissen ausgelöst, wie z.B. Ausfall der Stromversorgung. Der NMI-Handler führt in der kurzen verbleibenden Zeit nur die wichtigsten Sicherungs-Arbeiten durch, und unterbricht dazu alle anderen Prozesse.

An einem modernen Multiprozesor-System läuft der Vorgang zwar komplizierter ab, jedoch nach dem gleichen Prinzip.
Mehrere Aufgaben für einen ISR-Handler:
Man kann die Anzahl der Hardware Interrupt-Leitungen nicht beliebig vergrößern. Deshalb war es schon bald nach Einführung der ersten PC notwendig, an den meisten Leitungen mehrere ISR-Arbeiten zusammenzufassen.
Heutige ISR-Handler enthalten daher am Anfang mehrere bedingte Verzweigungen (if()...else). Je nach Situation (Inhalt der Register) verzweigt das Programm zu einer der vorgesehenen Arbeiten.

Jiffy

Der Interrupt-Handler führt an jedem PC-System eine Zähler-Variable, die bei jedem Aufruf des Handlers erhöht wird. Der Zähler wird bei System-Start auf =0 gesetzt. Die Zeitspanne zwischen 2 aufeinander folgenden Timer-Interrupts wird Jiffy genannt, die lauifende Anzahl Ticks.
Die Dauer eines Jiffy ist von Hardware und System abhängig, bei modernen PC-Systemen meist 1..10ms.
Bei lange (Monate) dauerndem Betrieb eines (Server)-PC kann der Jiffy-Zähler überlaufen. Moderne Betriebssysteme enthalten spezielle Vorkehrungen, um das System auch in diesem Fall ungestört weiterzuführen.
Der Begriff 'Jiffy' ist je nach Arbeitsgebiet mehrdeutig:
In der Elektronik bezeichnet man damit manchmal die Periodenzeit von Wechselstrom (1/50s, in den USA 1/60s).
In Physik und Chemie bezeichnet man damit die Zeit, die Licht im Vakuum benötigt, um (verschiedene) sehr kurze Distanzen zurückzulegen, z.B. den Durchmesser eines Nukleons (Atomkern-Teilchens)

Linux:

Mit dieser Anweisung an einer Shell-Konsole erhalten sie eine Interrupt-Übersicht in 2 Tabellen:
# cat /proc/interrupts

Tabelle 1, geordnet nach der Nummer der Interrupt-Leitung (1.Spalte). danach je 1 Spalte für jeden Prozessor, zuletzt eine kurze Erklärung.
Der Timer läuft normalerweise auf Interrupt Nr. 0 (IRQ0)

Tabelle 2: Eine Liste der bearbeiteten Interrupts. Die Bezeichnung LOC gibt normalerweise die 'Local timer interrupts' an. Die folgenden Spalten zeigen die Aufteilung auf die einzelnen Prozessoren.

Mit dieser Anweisung erhalten sie einen aufbereiteten Text aus aktueller Zeit und Jiffy-Counter:
# uptime
Nach der aktuellen Zeit (US-Version) folgt die Zeit seit dem System-Start in der üblichen Darstellung hh:mi

Diese Anweisung zeigt eine Übersicht der User, Prozesse und verwendeten Prozessor-Zeit:
# w
Die angezeigte Tabelle enthält u.a. die Zeit der Anmeldung (Login), die 'untätige' Zeit (Idle), die verwendete Prozessor-Zeit für alle Programme (JCPU) und für das in Spalte 'What' angegebene Programm (PCPU).

Windows

Windows Systeme verwenden in den meisten Fällen INT08 und nachfolgend INT1C (system timer tick) zur Zeitverwaltung. Weiters werden je # nach Version auch INT1A (get/set system time, alarm, ...) und INT4A (user alarm handler) verwendet.

Mit dieser Anweisung (ab Windows 2k) erhalten sie eine Tabelle:
C:\> net statistics server
Aus der Angabe 'Statistik seit...' kann man zumindest den Start-Zeitpunkt des Systems entnehmen.

Microsoft bietet für ältere Systeme das 45kB kleine Konsolen-Programm uptime.exe, welches die Zeit seit dem System-Start für den aktuellen oder für einen (im Netzwerk) entfernten PC als Text ausgibt.

Mit dieser Anweisung (ab Windows XP) erhalten sie einen aufbereiteten Text (alle Daten, nur Uptime):
C:\> systeminfo
C:\> systeminfo | find "Systembetriebszeit"

Ab Windows 7 gibt der Taskmanager | Leistung die Uptime an.

In der Windows Registry-Datenbank werden zahlreiche Daten verwaltet, die im Zusammenhang mit den Zeit-Funktionen des Systems stehen, z.B.

Suche in HKLM\System nach Begriffen wie 'Clock', 'Echtzeituhr', 'Systemzeitgeber', 'Windows-Zeitgeber'

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib
Zahlreiche Daten der aktuellen System-Leistung

HKLM\SYSTEM\CurrentColtrolSet\Servcies\W32Time
Windows-Zeitgeber

Die Live Zeit-Angaben dieser Seite erfolgen mit Hilfe der aktuellen Server-Zeit 00:00:00 Die Zeit-Differenz ihres PC zum Webserver beträgt +0 Sekunden

Letzte Änderung dieser Seite: 2012-03-10 07:49:14