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

Inhaltsverzeichnis
Vorwort
1 Einführung
2 Mathematische und technische Grundlagen
3 Hardware
4 Netzwerkgrundlagen
5 Betriebssystemgrundlagen
6 Windows
7 Linux
8 Mac OS X
9 Grundlagen der Programmierung
10 Konzepte der Programmierung
11 Software-Engineering
12 Datenbanken
13 Server für Webanwendungen
14 Weitere Internet-Serverdienste
15 XML
16 Weitere Datei- und Datenformate
17 Webseitenerstellung mit (X)HTML und CSS
18 Webserveranwendungen
19 JavaScript und Ajax
20 Computer- und Netzwerksicherheit
A Glossar
B Zweisprachige Wortliste
C Kommentiertes Literatur- und Linkverzeichnis
Stichwort

Buch bestellen
Ihre Meinung?

Spacer
IT-Handbuch für Fachinformatiker von Sascha Kersken
Der Ausbildungsbegleiter
Buch: IT-Handbuch für Fachinformatiker

IT-Handbuch für Fachinformatiker
Rheinwerk Computing
1216 S., 6., aktualisierte und erweiterte Auflage, geb.
34,90 Euro, ISBN 978-3-8362-2234-1
Pfeil 7 Linux
Pfeil 7.1 Arbeiten mit der Shell
Pfeil 7.1.1 Booten und Login
Pfeil 7.1.2 Virtuelle Terminals
Pfeil 7.1.3 Grundfunktionen der Shell
Pfeil 7.1.4 Hilfefunktionen
Pfeil 7.1.5 Pipes und Ein-/Ausgabeumleitung
Pfeil 7.1.6 Die wichtigsten Systembefehle
Pfeil 7.2 Konfigurations- und Administrationsaufgaben
Pfeil 7.2.1 Syslog und Log-Dateien
Pfeil 7.2.2 Programme automatisch starten
Pfeil 7.2.3 Software installieren
Pfeil 7.3 Automatisierung
Pfeil 7.3.1 Shell-Skripte
Pfeil 7.3.2 Weitere Hilfsmittel
Pfeil 7.4 Editoren
Pfeil 7.4.1 vi
Pfeil 7.4.2 Emacs
Pfeil 7.5 Grafische Benutzeroberflächen
Pfeil 7.5.1 Der X-Server
Pfeil 7.5.2 Desktops
Pfeil 7.6 Netzwerkkonfiguration unter Linux
Pfeil 7.6.1 Grundeinstellungen
Pfeil 7.6.2 TCP/IP-Dienstprogramme
Pfeil 7.6.3 Datei- und Druckserver unter Linux
Pfeil 7.7 Zusammenfassung

Rheinwerk Computing - Zum Seitenanfang

7.3 AutomatisierungZur nächsten Überschrift

Unix-Systeme enthalten zahlreiche Möglichkeiten, Routineaufgaben zu automatisieren. In diesem Abschnitt lernen Sie zunächst Shell-Skripte kennen, in denen Sie programmgesteuerte Kommandoabfolgen zusammenfassen können. In einem weiteren Abschnitt geht es um Hilfsmittel wie Aliasse und Cronjobs.


Rheinwerk Computing - Zum Seitenanfang

7.3.1 Shell-SkripteZur nächsten ÜberschriftZur vorigen Überschrift

Eine besondere Eigenschaft von Unix-Shells sind die eingebauten Befehle, mit deren Hilfe sich bestimmte Aufgaben automatisieren lassen. Im Grunde ist dieser Abschnitt ein Vorgriff auf das Thema des übernächsten Kapitels, die Programmierung. Dennoch sollen hier einige Worte zum Shell-Scripting gesagt werden. Falls Sie noch nie programmiert haben, sollten Sie sich allerdings zuerst Kapitel 9, »Grundlagen der Programmierung«, vornehmen. Konzepte, die an dieser Stelle nur ganz kurz und knapp angesprochen werden können, werden dort ausführlich erläutert.

Übersicht

Ein Shell-Skript ist im Grunde eine einfache Textdatei, die eine Abfolge von Shell- und Systembefehlen enthält. Diese Befehle werden beim Aufruf dieses Skripts nacheinander abgearbeitet. Für gewöhnlich erhalten Shell-Skripte die Dateiendung .sh. Der Name spielt aber eigentlich keine Rolle; wichtig ist, dass Sie das Skript mithilfe von chmod ausführbar machen.

Wie jedes Konsolenprogramm kann ein Shell-Skript Kommandozeilenparameter entgegennehmen. Hinter dem Namen des Skripts kann also beim Aufruf eine durch Leerzeichen getrennte Liste von Zeichenfolgen stehen, die das Skript verarbeiten kann.

Die erste Zeile eines Shell-Skripts enthält die sogenannte Shebang-Angabe – ein Kurzwort für die Zeichen # (sharp) und ! (bang), mit denen sie beginnt. An dieser Stelle steht, welche Shell dieses Skript ausführen soll, da sich verschiedene Shells in ihrer Skript-Syntax voneinander unterscheiden. Hier sehen Sie ein Beispiel für eine Shebang-Zeile; das zugehörige Skript wurde für die bash geschrieben:

#!/bin/bash

Nach dieser Zeile können Sie einen Befehl nach dem anderen untereinanderschreiben. Alle bisher besprochenen Systembefehle sind zulässig, darüber hinaus werden einige spezielle programmiertechnische Erweiterungen verwendet.

Die wichtigsten zusätzlichen Befehle und Elemente für Shell-Skripte sind folgende (hier konkret für die bash; bei anderen Shells kann die Syntax leicht abweichen):

  • Fallunterscheidungen. Anweisungen, die zwischen if Bedingung then und fi stehen, werden nur ausgeführt, wenn die Bedingung zutrifft. In der Regel besteht die Bedingung aus dem Vergleich zwischen einer Variablen oder einem Dateinamen und einem bestimmten Wert. Ein solcher Ausdruck steht bei Text- und Dateivergleichen in eckigen Klammern. Dabei stehen unter anderem folgende Vergleichsmöglichkeiten zur Verfügung:
    • [ -e Pfad ] – Verzeichniseintrag existiert.
    • [ -f Pfad ] – Verzeichniseintrag ist eine Datei.
    • [ -d Pfad ] – Verzeichniseintrag ist ein Verzeichnis.
    • [ -s Pfad ] – Verzeichniseintrag ist ein Symlink.
    • [ str1 = str2 ] – Strings sind identisch.
    • [ str1 != str2 ] – Strings sind verschieden.
    • [ -z str ] – String ist leer (zero).
    • [ -n str ] – String hat Inhalt (nonzero).
    • [ expr1 -a expr2 ] – beide Ausdrücke sind wahr (and).
    • [ expr1 -o expr2 ] – mindestens ein Ausdruck ist wahr (or).

    Für numerische Vergleiche werden doppelte runde Klammern verwendet: ((...)). Darin stehen die bekannten Vergleichsoperatoren ==, !=, <, >, <= und >= zur Verfügung.

    Alternativ kann auch der Erfolg eines Kommandos getestet werden. Dazu wird der Befehl mit seinen Parametern und Argumenten ohne weitere Kennzeichnung zwischen if und then geschrieben. Befehle werden mit einem Exit-Code beendet. 0 bedeutet in der Regel, dass alles in Ordnung ist, andere Werte deuten auf Fehler hin. Die Anweisungen werden bearbeitet, wenn der Befehl korrekt ausgeführt wird, weil der Exit-Code 0 als wahr gilt und jeder andere Wert als falsch.[Anm.: Übrigens ganz im Gegensatz zu fast allen Programmiersprachen, in denen nämlich 0 als falsch gilt und jeder andere Wert als wahr. In Shell-Skripten gilt diese Besonderheit allerdings auch nur für den Exit-Code.]

    Hinter else können Sie alternative Anweisungen definieren, die ausgeführt werden sollen, falls die Bedingung nicht zutrifft, mit elif (Abkürzung für else if) kann sogar eine verschachtelte Bedingung eingesetzt werden.

  • Einzelfallentscheidungen. Zwischen case und esac können Sie verschiedene Muster aufführen, denen eine angegebene Variable oder ein String mit Variablen entsprechen kann. Die vollständige Schreibweise ist case String in. Hinter jedem Muster, das überprüft wird, steht eine schließende Klammer ). Darauf folgen beliebig viele Anweisungen, die nur ausgeführt werden, wenn das angegebene Muster auf den überprüften String passt. Vor dem nächsten Muster muss eine Befehlssequenz durch ;; abgeschlossen werden. Am Schluss kann *) stehen, um sämtliche noch nicht anderweitig gefundenen Werte zu verarbeiten – etwa, um ungültige Argumente per Fehlermeldung abzufangen.
  • Schleifen. Mitunter müssen bestimmte Anweisungen mehrfach ausgeführt werden. Dafür sind Schleifen zuständig. Die bash definiert verschiedene Arten von Schleifen; die wichtigsten sind die for-Schleife und die while-Schleife.

    Eine for-Schleife geht automatisch alle Kommandozeilenparameter durch, die Parameter werden nacheinander der angegebenen Schleifenvariablen zugewiesen. Alternativ können Sie mithilfe von for ... in ein Dateimuster angeben. Die Variable nimmt dann nacheinander den Namen jeder Datei an, auf die dieses Muster passt.

    Die while-Schleife verwendet dagegen eine Bedingung wie if, mit dem Unterschied, dass die Anweisungen mehrmals ausgeführt werden, solange die Bedingung noch zutrifft.

    Die Anweisungen, die in jedem Durchlauf der Schleife ausgeführt werden sollen, stehen in beiden Fällen zwischen do und done.

  • Variablen. Mithilfe der Anweisung var = Wert wird einer Variablen innerhalb eines Shell-Skripts ein Wert zugewiesen. Es kann sich dabei sowohl um eine der Umgebungsvariablen wie PATH handeln als auch um beliebige temporäre Variablen, die nur innerhalb des Skripts verwendet werden, um Ihnen die Arbeit zu erleichtern.

    Wenn die Variablendefinition in einer Shell und allen in ihr aufgerufenen Skripten gültig bleiben soll, müssen Sie in der bash übrigens das Kommando export var = Wert verwenden.

    Innerhalb von Befehlen, die Sie in einem Shell-Skript aufrufen, wird eine Variable durch ein vorangestelltes $-Zeichen vor der Ausführung des Befehls durch ihren aktuellen Wert ersetzt (substituiert). Innerhalb eines komplexen Ausdrucks steht der Variablenname hinter dem Dollarzeichen zusätzlich in geschweiften Klammern {...}.

    Spezielle Variablen sind $0 bis $9 für die einzelnen Kommandozeilenparameter, $* für die gesamte Liste dieser Parameter zur Verwendung in einer Schleife und $# für die Anzahl der übergebenen Parameter.

Beispiele

Es folgen zwei kleine Beispiele, die die praktische Verwendung der zuvor erläuterten Anweisungen demonstrieren. Zuerst sehen Sie hier ein Skript, das im übernächsten Kapitel (ohne Datum und Uhrzeit) auch in allen vier ausführlicher vorgestellten Programmiersprachen gezeigt wird. Es gibt den klassischen Programmiereinstiegssatz »Hallo Welt!« aus, fügt Datum und Uhrzeit hinzu, fragt den Benutzer nach dessen Namen und begrüßt ihn anschließend damit. Hier der Code:

#!/bin/bash
echo Hallo, Welt!
echo Es ist `date +"%d.%m.%Y, %H:%M"`
echo -n "Wie heisst du? "
read name
echo Hallo, $name!

Speichern Sie das Skript, zum Beispiel unter dem Namen hallo.sh, und machen Sie es wie folgt ausführbar:

$ chmod +x hallo.sh

Danach können Sie es ausführen. Hier ein komplettes Ein- und Ausgabebeispiel:

$ ./hallo.sh
Hallo, Welt!
Es ist 07.05.2013, 17:43
Wie heisst du? Sascha
Hallo, Sascha!

Die meisten in dem Skript verwendeten Anweisungen wurden bereits erläutert.

Das folgende kurze Beispiel definiert ein Skript namens backup, das alle Dateien, die auf ein angegebenes Dateimuster passen, in Dateien mit der zusätzlichen Endung .tmp sichert:

#!/bin/bash
if (( $# < 1 ))
then
echo "Verwendung: backup Dateimuster"
exit 1
fi
for i in $*
do
echo "Verarbeite ${i}"
if [ -f $i ]
then
cp $i ${i}.tmp
fi
done

Wenn kein Dateimuster angegeben wird, erscheint eine Warnmeldung, und das Skript wird mit einem Fehlercode beendet. Andernfalls werden alle gewöhnlichen Dateien (Test -f), die zum angegebenen Dateimuster passen, in einer Schleife nacheinander in entsprechenden .tmp-Dateien gesichert. Der folgende Aufruf sichert alle Dateien mit der Endung .txt im aktuellen Verzeichnis:

$ ./backup *.txt

Im übernächsten Kapitel werden übrigens die Skriptsprachen Perl und Ruby vorgestellt, die mit einer eingängigeren Syntax und erheblich weitergehenden Möglichkeiten eine hervorragende Ergänzung oder gar Alternative zu Shell-Skripten bieten.


Rheinwerk Computing - Zum Seitenanfang

7.3.2 Weitere HilfsmittelZur nächsten ÜberschriftZur vorigen Überschrift

Für die Arbeit mit Shell-Skripten, aber auch unabhängig davon, bieten Unix-Systeme einige weitere Automatisierungsmöglichkeiten, die hier kurz besprochen werden.

Aliasse

Aliasse sind eine Möglichkeit der bash, längere Befehlseingaben, etwa mit zahlreichen Parametern, zu einer Art Makro zu verkürzen. Grundsätzlich geschieht dies mithilfe einer Eingabe nach dem Schema:

$ alias Aliasname='Kommando [Argumente]'

Hier ein Beispiel, das ls mit den Optionen -l (Detailinformationen) und -a (auch versteckte Dateien anzeigen) unter dem Alias l bereitstellt:

$ alias l='ls -la'

Aufgerufen wird ein solcher Alias wie ein gewöhnliches Kommando. Beispiel:

$ l

Auch Aliassen können Sie Optionen oder Argumente übergeben, solange der zugrundeliegende Befehl diese unterstützt. Das folgende Beispiel ruft den Alias l mit der zusätzlichen Option -X (nach Dateiendungen sortieren) sowie dem Dateimuster a* (mit a beginnende Dateien und Verzeichnisse) auf:

$ l -X a*

Die Definition eines Alias können Sie sich mit alias Name anschauen, also etwa

$ alias l

alias ohne Argumente zeigt alle aktuellen Alias-Definitionen an. unalias Name löscht den angegebenen Alias. Genau wie Umgebungsvariablen sind auch Aliasse in vielen Distributionen in den Shell-Konfigurationsskripten vorkonfiguriert.

Cronjobs

Manche Administrationsaufgaben oder Aufräumarbeiten müssen regelmäßig erledigt werden. Mit Cronjobs bieten Unix-Systeme eine flexible Möglichkeit, diese zu automatisieren.

Die einfachere Methode besteht darin, einen Symlink auf das auszuführende Programm oder Shell-Skript in einem der folgenden Verzeichnisse anzulegen:

  • /etc/cron.hourly (stündlich)
  • /etc/cron.daily (täglich)
  • /etc/cron.weekly (wöchentlich)
  • /etc/cron.monthly (monatlich)

Das folgende Beispiel sorgt dafür, dass ein Skript namens taeglich.sh jeden Tag ausgeführt wird:

# ln -s /usr/bin/skripten/taeglich.sh \
> /etc/cron.daily/taeglich.sh

Erheblich flexibler, aber etwas komplizierter in der Handhabung ist die Arbeit mit sogenannten Crontabs, die für jeden User einzeln angelegt werden. Es handelt sich um Textdateien, in denen jede Zeile einen Eintrag in folgendem Format darstellt:

Min Std Tag Mon Wochentag Kommando

Für die Zeit-Felder gelten folgende Wertebereiche:

  • Minute: 059
  • Stunde: 023
  • Tag im Monat: 131
  • Monat: 112
  • Wochentag: 06 (0 = Sonntag, 1 = Montag ... 6 = Samstag)

Ein * in einem der Felder sorgt dafür, dass der Cronjob für jeden Wert in diesem Feld gilt. Hier ein Beispiel, das ein Skript namens cleanup.sh jeden Freitag um 18:00 Uhr ausführt:

0 18 * * 5 /usr/bin/skripten/cleanup.sh

Das folgende Beispiel ruft zu jeder vollen Stunde das Skript stuendlich.sh auf:

0 * * * * /usr/bin/skripten/stuendlich.sh

Auch Bereiche in der Form Start-Ende sind für ein Feld möglich. Das folgende Beispiel führt montags bis samstags von 8 bis 18 Uhr jeweils ein Skript namens arbeit.sh aus:

0 8-18 * * 1-6 /usr/bin/skripten/arbeit.sh

Hinter * oder Start-Ende können Sie optional einen / und ein Intervall angeben. Das folgende Beispiel führt alle zwei Stunden who -a aus, um eine vollständige Liste der angemeldeten Benutzer und virtuellen Terminals zu erzeugen:

0 */2 * * * who -a

Eventuelle Ausgaben der betreffenden Skripte werden mithilfe des Kommandos mail an den betreffenden Benutzer geschickt. Optional fügen Sie als erste Zeile der Crontab eine Anweisung wie diese ein, um die Mails an einen anderen User zu schicken (sinnvoll beispielsweise für die root-Crontab):

MAILTO=sascha

Geben Sie mail ein, um solche Nachrichten zu lesen. Die jeweilige Nummer zeigt eine bestimmte Nachricht an; Q beendet sowohl die einzelne Nachricht als auch das Programm.

Der Befehl crontab mit der Option -e ermöglicht die Bearbeitung der Crontab im Editor vi, der im nächsten Abschnitt vorgestellt wird. crontab -l liefert die aktuelle Crontab, und crontab -r entfernt sie. Als root können Sie auch die Option -u Username hinzufügen, um die Crontab eines anderen Benutzers zu lesen oder zu ändern.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< zurück




Copyright © Rheinwerk Verlag GmbH 2013
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.


[Rheinwerk Computing]

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


  Zum Katalog
Zum Katalog: IT-Handbuch für Fachinformatiker






IT-Handbuch für Fachinformatiker
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Katalog: Linux Handbuch






 Linux Handbuch


Zum Katalog: Computer Netzwerke






 Computer Netzwerke


Zum Katalog: Schrödinger lernt HTML5, CSS3 und JavaScript






 Schrödinger lernt
 HTML5, CSS3
 und JavaScript


Zum Katalog: Windows 8.1 Pro






 Windows 8.1 Pro


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo