Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
Shell-Programmierung von Jürgen Wolf
Einführung, Praxis, Referenz
Buch: Shell-Programmierung

Shell-Programmierung
782 S., mit CD, 44,90 Euro
Rheinwerk Computing
ISBN 3-89842-683-1
gp Kapitel 8 Rund um die Ausführung von Scripts und Prozessen
  gp 8.1 Prozessprioritäten
  gp 8.2 Warten auf andere Prozesse
  gp 8.3 Hintergrundprozess wieder hervorholen
  gp 8.4 Hintergrundprozess schützen
  gp 8.5 Subshells
  gp 8.6 Mehrere Scripts verbinden und ausführen (Kommunikation zwischen Scripts)
    gp 8.6.1 Datenübergabe zwischen Scripts
    gp 8.6.2 Rückgabe von Daten an andere Scripts
    gp 8.6.3 Scripts synchronisieren
  gp 8.7 Jobverwaltung
  gp 8.8 Shellscripts zeitgesteuert ausführen
  gp 8.9 Startprozess- und Profildaten der Shell
    gp 8.9.1 Arten von Initialisierungsdateien
    gp 8.9.2 Ausführen von Profildateien beim Start einer Login-Shell
    gp 8.9.3 Ausführen von Profildateien beim Start einer Nicht-Login-Shell (Bash und Korn-Shell)
    gp 8.9.4 Zusammenfassung alle Profil- und Startup-Dateien
  gp 8.10 Ein Shellscript bei der Ausführung
    gp 8.10.1 Syntaxüberprüfung
    gp 8.10.2 Expansionen
    gp 8.10.3 Kommandos
  gp 8.11 Shellscripts optimieren


Rheinwerk Computing

8.8 Shellscripts zeitgesteuert ausführetoptop

Als Systemadministrator oder Webmaster werden Sie zwangsläufig mit folgenden Wartungstätigkeiten konfrontiert:

gp  Sichern von Daten (Backup)
gp  Konsistenzüberprüfung
gp  »Rotieren« von Logfiles

Solange Sie auf einem Einzelplatz-Rechner arbeiten, können Sie hin und wieder solche Scripts, die diese Aufgaben erledigen, selbst von Hand starten (wobei dies auf Dauer auch sehr mühsam erscheint). Allerdings hat man es in der Praxis nicht nur mit einem Rechner zu tun, sondern mit einer ganzen Horde. Sie werden sich wohl kaum auf einem Dutzend Rechner einloggen, um jedes Mal ein Backup-Script von Hand zu starten.

Für solche Aufgaben wurden unter Linux/UNIX Daemons (Abkürzung für disk and execution monitors) eingeführt. Daemons (auch gern als Dämonen oder Geister bezeichnet) sind Prozesse, die zyklisch oder ständig im Hintergrund ablaufen und auf Aufträge warten. Auf Ihrem System laufen wahrscheinlich ein gutes Dutzend solcher Daemons. Die meisten werden beim Start des Systems vom Übergang in den Multi-User-Modus automatisch gestartet. In unserem Fall geht es vorwiegend um den cron-daemon.

»cron« kommt aus dem Griechischen (chronos) und bedeutet Zeit. Bei diesem cron-daemon definieren Sie eine Aufgabe und delegieren diese dann an den Daemon. Dies realisieren Sie durch einen Eintrag in crontab, einer Tabelle, in der festgelegt wird, wann welche Jobs ausgeführt werden sollen. Es ist logisch, dass der Rechner (und der cron-daemon) zu der Zeit laufen muss, zu der ein entsprechender Job ausgeführt wird. Dass dies nicht immer möglich ist, leuchtet ein (besonders bei einem Heimrechner). Damit aber trotzdem gewährleistet wird, dass die Jobs in der Tabelle crontab ausgeführt werden, bieten einige Distributionen zusätzlich den Daemon anacron an. Dieser tritt immer an die Stelle von cron und stellt sicher, dass die Jobs regelmäßig zu einer bestimmten Zeit ausgeführt werden – also auch, wenn der Rechner nicht eingeschaltet ist.

crond macht also in der Praxis nichts anderes, als in bestimmten Zeitintervallen (Standard eine Minute) die Tabelle crontab einzulesen und entsprechende Jobs auszuführen. Somit müssen Sie, um den cron-daemon zu verwenden, nichts anderes tun, als in crontab einen entsprechenden Eintrag zu hinterlegen. Bevor Sie erfahren, wie Sie dies praktisch anwenden, muss ich noch einige Anmerkungen zu Ihren Scripts machen, die mit dem cron-daemon gestartet werden sollen.

Wenn Sie ein Script mit dem cron-daemon starten lassen, sollten Sie sich immer vor Augen halten, dass Ihr Script keine Verbindung mehr zum Bildschirm und zur Tastatur hat. Damit sollte Ihnen klar sein, dass eine Benutzereingabeaufforderung mit read genauso sinnlos ist wie eine Ausgabe mittels echo. In beiden Fällen sollten Sie die Ein- bzw. Ausgabe umlenken. Die Ausgaben werden meist per Mail an den Eigentümer der crontab geschickt.

Ebenso sieht dies mit den Umgebungsvariablen aus. Sie haben in den Kapiteln zuvor recht häufig die Umgebungsvariablen verändert und verwendet, allerdings können Sie sich niemals zum Zeitpunkt der Ausführung eines Scripts, das vom cron-daemon gestartet wurde, darauf verlassen, dass die Umgebung derjenigen entspricht, wie sie vielleicht beim Testen des Shellscripts vorlag. Daher werden auch in der crontab-Datei entsprechende Umgebungsvariablen belegt. Wird ein cron-Job ausgeführt, wird die Umgebung des cron-daemons verwendet. LOGNAME (oder auch USER) wird auf den Eigentümer der crontab-Datei gesetzt und HOME auf dessen Verzeichnis, so wie dies bei /etc/passwd der Fall ist. Allerdings können Sie nicht alle Umgebungsvariablen in der crontab-Datei neu setzen. Was mit SHELL und HOME kein Problem ist, ist mit LOGNAME bzw. USER nicht möglich. Sicherstellen sollten (müssen) Sie auch, dass PATH genauso aussieht wie in der aktuellen Shell – sonst kann es passieren, dass einige Kommandos gar nicht ausgeführt werden können. Programme und Scripts sollten bei cron-Jobs möglichst mit absoluten Pfaden angegeben werden, um den etwaigen Problemen mit PATH vorzubeugen.

Wollen Sie wissen, ob Ihr Script jetzt im Hintergrund läuft oder nicht (wegen der Ein-/Ausgabe), können Sie dies im Script tty überprüfen. Wenn das Script nicht im Hintergrund läuft, gibt tty /dev/tty oder Ähnliches zurück. Läuft das Script allerdings im Hintergrund, gibt es keinen Bildschirm zur Ausgabe und tty gibt einen Fehlerstatus (ungleich 0) wie 1 zurück. Natürlich sollten Sie diese Überprüfung im Stillen ausführen, damit im Fall der Fälle keine störende Ausgabe auf dem Bildschirm erfolgt. Dies können Sie mit der Option –s (silence) erreichen:

you@host > tty
/dev/pts/39
you@host > tty -s
you@host > echo $?
0

Ebenso können Sie die Shell-Variable PS1 überprüfen, welche gewöhnlich nur bei der interaktiven Shell gesetzt wird.

Der cron-daemon speichert seine Einträge in der crontab-Datei. Dieser Pfad befindet sich gewöhnlich im /etc-Verzeichnis. Allerdings handelt es sich hierbei um die cron-Jobs von root. Natürlich hat auch jeder andere Benutzer auf dem System seine eigene crontab-Datei, welche sich für gewöhnlich im Verzeichnis /var/spool/cron/ befindet.

Zum Modifizieren der crontab-Datei genügt ein einfaches crontab mit der Option –e (edit). Normalerweise öffnet sich die crontab-Datei mit dem Standardeditor (meistens vi). Wollen Sie einen anderen Editor verwenden (bspw. nano, pico, joe ...), müssen Sie die Variable VISUAL oder EDITOR ändern und exportieren (export VISUAL='editor_ihrer_wahl'). Gewöhnlich ist die Datei, die sich in vi öffnet, leer (bei der ersten Verwendung von cron als normaler Benutzer).

Was aber schreibt man in eine solche crontab-Datei? Natürlich die Jobs, und zwar mit folgender einfacher Syntax:


Tabelle 8.2   Ein Eintrag in die crontab-Datei

Minuten Stunden Tage Monate Wochentage [User] Befehl
0–59 0–23 1–31 1–12 0–7 Name kommando_oder_script

Praktisch besteht jede einzelne Zeile aus 6 (bzw. 7) Spalten, in denen ein Auftrag festgelegt wird. Die Spalten werden durch ein Leer- bzw. ein Tabulatorzeichen voneinander getrennt. In der ersten Spalte werden die Minuten (0–59), in der zweiten die Stunden (0–23), in der dritten die Tage (1–31), in der vierten die Monate (1–12), in der fünften die Wochentage (0–7; 0 und 7 stehen hierbei für Sonntag) und in der sechsten Spalte wird das Kommando bzw. Script angegeben, welches zum gegebenen Zeitpunkt ausgeführt werden soll. In der Syntax finden Sie noch eine Spalte »User« (die sechste), welche allerdings beim normalen User entfällt. Diese Spalte ist dem root vorbehalten, in dem dieser einen cron-Job für bestimmte User einrichten kann. Somit besteht eine Zeile (Auftrag) einer crontab-Datei für den normalen Benutzer aus sechs und für den root aus sieben Spalten.

Natürlich können Sie auch Kommentare bei der crontab–Datei hinzufügen. Diese werden mit der Shellscript-üblichen # eingeleitet. Sie können bei den Zeitangaben statt Zahlen auch einen Stern (*) verwenden, was für »Erster-Letzter« steht – also »immer«. Somit würde folgender Eintrag das Script »meinscript« jede Minute ausführen:

# Führt das Script jede Minute aus
* * * * * $HOME/meinscript

Es sind auch Zahlenbereiche erlaubt, so kann z. B. ein Bereich durch einen Bindestrich von einem anderen getrennt werden. Die Zahlen zwischen den Bereichen sind immer inklusive. Somit bedeutet folgender Eintrag, dass das Script »meinscript« jeden Tag um 10, 11, 12, 13 und 14 Uhr ausgeführt wird:

0 10–14 * * * $HOME/meinscript

Es können auch Listen verwendet werden, bei denen Nummern oder auch ein Zahlenbereich von Nummern durch Kommata getrennt werden:

0 10–12,16,20–23 * * * $HOME/meinscript

Hier würde jeden Tag um 10, 11, 12, 16, 20, 21, 22 und 23 Uhr das Script »meinscript« ausgeführt. Es dürfen keine Leerzeichen in der Liste vorkommen, da das Leerzeichen ja das Trennzeichen für den nächsten Eintrag ist.

Es sind außerdem Aufträge in bestimmten Schritten möglich. So könnten Sie statt der Angabe, alle 4 Stunden ein bestimmtes Script auszuführen, mit

0 0,4,8,12,16,20 * * * $HOME/meinscript

dies mit 0–23/4 oder */4 verkürzen:

0 */4 * * * $HOME/meinscript

Hier einige Beispiele zum besseren Verständnis:

# Jeden Tag um 11 Uhr das Script meinscript ausführen
0 11 * * * $HOME/meinscript
# Jeden Dienstag und Freitag um 23 Uhr das Script
# meinscript ausführen
0 23 * * 2,5 $HOME/meinscript
# Jeden zweiten Tag das Script meinscript um 23 Uhr ausführen
0 23 * * 0–6/2 $HOME/meinscript
# Achtung: Das Script wird jeden 15. eines Monats UND jeden
# Samstag um 23 Uhr ausgeführt
0 23 15 * 6 $HOME/meinscript

Gewöhnlich wird Ihre crontab-Datei auf Dauer immer umfangreicher. Sofern Sie crontab zur Fernwartung einsetzen, können Sie sich die Ausgabe Ihres Scripts per E-Mail zuschicken lassen. Hierzu müssen Sie die Variable MAILTO (per Standard meist auf user@host gesetzt) in crontab mit Ihrer E-Mail-Adresse versehen. Mit einem leeren MAILTO ("") können Sie dies wieder abschalten. Es kann auch sinnvoll sein, die SHELL entsprechend zu verändern, da standardmäßig häufig die Bourne-Shell verwendet wird. Da die Korn-Shell bzw. die Bash oft beim Thema »Builtins« und einigen weiteren Funktionen überlegen ist, sollten Sie hier entsprechende Shell eintragen, da ansonsten die Scripts nicht richtig laufen könnten. Unter Linux ist dies allerdings – wie schon einige Mal erwähnt – zweitrangig, da es hier keine echte Bourne-Shell gibt und alles ein Link auf die Bash ist. Hierzu soll eine einfach crontab-Datei erstellt werden:

you@host > crontab -e
### ---vi startet--- ###
SHELL=/bin/ksh
MAILTO=tot
# Alle zwei Minuten "Hallo Welt" an die Testdatei hängen
*/2 * * * * echo "Hallo Welt" >> $HOME/testdatei
###--- Abspeichern und Quit (:wq)---###
crontab: installing new crontab
you@host >

Wollen Sie einen Überblick aller cron-Jobs gewinnen, müssen Sie nur crontab mit der Option –l (für list) aufrufen. Die vollständige Tabelle können Sie mit der Option –r (remove) löschen.

you@host > crontab -l
# DO NOT EDIT THIS FILE – edit the master and reinstall.
# (/tmp/crontab.8999 installed on Mon Mar 28 19:07:50 2005)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
SHELL=/bin/bash
MAILTO=tot
# Alle zwei Minuten "Hallo Welt" an die Testdatei hängen
*/2 * * * * echo "Hallo Welt" >> $HOME/testdatei
you@host > crontab -r
you@host > crontab -l
no crontab for you

Tabelle 8.3   Optionen für crontab und deren Bedeutung

Aufruf Bedeutung
crontab –e Die crontab-Datei editieren
crontab –l Alle cron-Jobs auflisten
crontab –r Alle cron-Jobs löschen

Soweit so gut, alles hier Beschriebene (siehe Tabelle 8.3) gilt für den cron-daemon unter Linux. Es gibt allerdings drei Versionen des cron-daemons (eine BSD-Variante, eine SYS-V-Version und die Linux-Variante). So ist bspw. MAILTO rein Linux-spezifisch und funktioniert eventuell nirgendwo anders sonst. Auch ist die Zuweisung von Variablen in der crontab-Datei kein Standard, der überall funktionieren muss. Und das Wichtigste: Es kann sein, dass auf einigen Systemen die einzelnen Spalten mit einem Tabulatorzeichen getrennt sein müssen, auf einem anderen aber mit einem Leerzeichen. Linux wiederum kennt beides. Daher sollte immer erst die Manual-Page angesteuert werden, um hundertprozentig sicher zu gehen.



Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

 << zurück
  
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Shell-Programmierung
Shell-Programmierung
bestellen
 Buchtipps
Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-Programmierung


Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2005
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern