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 1 Einführung
  gp 1.1 Voraussetzungen an den Leser
    gp 1.1.1 Zielgruppe
    gp 1.1.2 Notation
  gp 1.2 Was ist eine Shell?
  gp 1.3 Hauptanwendungsgebiet
    gp 1.3.1 Was ist ein Shellscript?
    gp 1.3.2 Vergleich mit anderen Sprachen
  gp 1.4 Kommando, Programm oder Shellscript?
    gp 1.4.1 Shell-eigene Kommandos (Builtin-Kommando)
    gp 1.4.2 Aliase in der Shell
    gp 1.4.3 Funktionen in der Shell
    gp 1.4.4 Shellscripts (Shell-Prozeduren)
    gp 1.4.5 Programme (binär)
  gp 1.5 Die Shell-Vielfalt
    gp 1.5.1 ksh (Korn-Shell)
    gp 1.5.2 Bash (Bourne-Again-Shell)
    gp 1.5.3 zsh (Z-Shell)
    gp 1.5.4 ash (A-Shell)
    gp 1.5.5 rbash, rzsh (Restricted Shell)
    gp 1.5.6 tcsh (TC-Shell)
    gp 1.5.7 Welche Shell-Variante wird in diesem Buch verwendet?
    gp 1.5.8 rsh und ssh
  gp 1.6 Betriebssysteme
  gp 1.7 Crashkurs: einfacher Umgang mit der Kommandozeile
    gp 1.7.1 Grundlegende Befehle
    gp 1.7.2 Der Umgang mit Dateien
    gp 1.7.3 Der Umgang mit Verzeichnissen
    gp 1.7.4 Datei- und Verzeichnisnamen
    gp 1.7.5 Gerätenamen
    gp 1.7.6 Dateiattribute
  gp 1.8 Shellscripts schreiben und ausführen
    gp 1.8.1 Der Editor
    gp 1.8.2 Der Name des Shellscripts
    gp 1.8.3 Ausführen
    gp 1.8.4 Hintergrundprozess starten
    gp 1.8.5 Ausführende Shell festlegen
    gp 1.8.6 Kommentare
    gp 1.8.7 Stil
    gp 1.8.8 Ein Shellscript beenden
    gp 1.8.9 Testen und Debuggen von Shellscripts
    gp 1.8.10 Shellscript, das ein Shellscript erstellt und ausführt
  gp 1.9 Vom Shellscript zum Prozess
    gp 1.9.1 Ist das Shellscript ein Prozess?
    gp 1.9.2 Echte Login-Shell?
  gp 1.10 Datenstrom
    gp 1.10.1 Ausgabe umleiten
    gp 1.10.2 Standardfehlerausgabe umleiten
    gp 1.10.3 Eingabe umleiten
    gp 1.10.4 Pipes
    gp 1.10.5 Ein T-Stück mit tee
    gp 1.10.6 Ersatzmuster (Wildcards)
    gp 1.10.7 Brace Extension (Bash und Korn-Shell only)
    gp 1.10.8 Muster-Alternativen (Bash und Korn-Shell only)
    gp 1.10.9 Tilde-Expansion (Bash und Korn-Shell only)
  gp 1.11 Empfehlung


Rheinwerk Computing

1.9 Vom Shellscript zum Prozesdowntop

Ein Prozess ist nichts anderes als ein Programm bei der Ausführung. Geben Sie bspw. in einer Shell das Kommando pwd ein, wird Ihnen das aktuelle Verzeichnis angezeigt, in dem Sie sich gerade befinden. Zwar ist hier häufig die Rede von einem Kommando, doch letztendlich ist dies auch nur ein Prozess bei der Ausführung.

Diesem Prozess (wir bleiben einfach mal beim Kommando pwd) steht zur Ausführungszeit die komplette Verwaltungseinheit des Betriebssystems zur Verfügung, so als wäre dies das einzige Programm, das gerade läuft. Vereinfacht heißt dies, dass im Augenblick der Ausführung dem Kommando pwd die komplette Rechenleistung der CPU (Prozessor) zur Verfügung steht. Natürlich ist diese alleinige Verfügbarkeit zeitlich begrenzt, denn sonst würde es sich ja nicht um ein Multitasking-Betriebssystem handeln. Gewöhnlich werden auf einem Betriebssystem mehrere Programme gleichzeitig ausgeführt. Auch dann, wenn Sie noch gar kein Programm gestartet haben, laufen viele Dienste – und je nach Einstellung auch Programme – im Hintergrund ab (Daemon-Prozesse).

In der Praxis hat es den Anschein, als würden alle Prozesse zur gleichen Zeit ausgeführt. Dies ist aber nicht möglich, da ein Prozess im Augenblick der Ausführung eine CPU benötigt, und allen anderen Prozessen eben in dieser Zeit keine CPU zur Verfügung steht. Anders hingegen sieht dies natürlich aus, wenn mehrere CPUs im Rechner vorhanden sind. Dann wäre theoretisch die Ausführung von mehreren Prozessen (echtes Multithreading) gleichzeitig möglich – pro CPU eben ein Prozess.

Jeder dieser Prozesse besitzt eine eindeutige systemweite fortlaufende Prozessnummer (kurz PID für Process Identification Number). Vom Betriebssystem selbst wird sichergestellt, dass hierbei keine Nummer zweimal vorkommt. Stehen bei der Vergabe von PIDs keine Nummern mehr zur Verfügung, wird wieder bei 0 angefangen (bereits vergebene Nummern werden übersprungen). Natürlich können nicht unendlich viele Prozesse ausgeführt werden, sondern dies ist abhängig von der Einstellung des Kernels (wo mindestens 32768 Prozesse garantiert werden). Dieser Wert kann zwar nach oben »gedreht« werden, das fordert dann allerdings auch mehr Hauptspeicher, da die Prozessliste nicht ausgelagert (geswapt) werden kann.

Zur Überwachung von Prozessen sind des Administrators liebste Werkzeuge die Kommandos ps und top geworden (natürlich gibt es auch grafische Alternativen zu diesen beiden System-Tools). Das Kommando ps liefert Ihnen Informationen über den Status von aktiven Prozessen. Mit ps lässt sich die aktuelle PID, die UID, der Steuerterminal, der Speicherbedarf eines Prozesses, die CPU-Zeit, der aktuelle Status des Prozesses und noch eine Menge mehr anzeigen. Da ps allerdings nur den momentanen Zustand von Prozessen ausgibt, kann man nie genau sagen, wo gerade wieder mal ein Prozess Amok läuft. Für eine dauerhafte Überwachung von Prozessen wurde das Kommando top entwickelt. Abhängig von der Einstellung aktualisiert top die Anzeige nach einigen Sekunden (laut Standardeinstellung meistens nach 3 Sekunden) und verwendet dazu auch noch relativ wenig Ressourcen in Ihrem System.

Ein grundlegendes Prinzip unter Linux/UNIX ist es, dass ein Prozess einen weiteren Prozess starten kann. Dieses Prinzip wurde bereits beschrieben, als es darum ging, ein Shellscript auszuführen. Dabei startet die Login-Shell eine weitere Shell (also einen weiteren Prozess). Erst die neue Shell arbeitet jetzt Zeile für Zeile das Shellscript ab. Hier haben Sie ein Eltern-Kind-Prinzip. Jeder Kindprozess (abgesehen von »init« mit der PID 1) hat einen Elternprozess, der ihn gestartet hat. Den Elternprozess kann man anhand der PPID-Nummer (PPID = Parent Process Identifier) ermitteln. So können Sie die ganze Ahnengalerie mithilfe von ps –f nach oben laufen:

you@host > ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
tot       3675  3661  0 10:52 pts/38   00:00:00 /bin/bash
tot       5576  3675  0 12:32 pts/38   00:00:00 ps -f

Hier wird bspw. der eben ausgeführte Prozess ps –f mit der PID 5576 aufgelistet. Der Elternprozess, der diesen Prozess gestartet hat, lautet 3675 (siehe PPID) – was die PID der aktuellen bash (hier eine Zeile höher) ist. Die komplette Ahnengalerie können Sie aber auch etwas komfortabler mit dem Kommando pgrep (siehe Kapitel 14, Linux-UNIX-Kommandoreferenz) ermitteln.


Rheinwerk Computing

1.9.1 Ist das Shellscript ein Prozess?  downtop

Diese Frage kann man mit »Jein« beantworten. Denn schließlich startet die Login-Shell mit der Subshell schon mal einen weiteren Prozess. Und die Subshell startet mit unserem Shellscript einen oder mehrere Prozesse, also ebenfalls einen weiteren Kindprozess. Aber bedenken Sie bitte, dass ein Shellscript keine ausführbare Anwendung im eigentlichen Sinne ist, sondern eine Textdatei. Die Subshell startet gegebenenfalls weitere Prozesse, die Sie in dieser Textdatei (Ihrem Shellscript) angeben. Am besten kann man diesen Vorgang mit dem Kommando ps verdeutlichen:

# Script-Name : myscript
ps -f

Führen Sie das Shellscript myscript aus. Hier sieht die Ausgabe wie folgt aus:

you@host > ./myscript
UID        PID  PPID  C STIME TTY          TIME CMD
tot       3679  3661  0 10:52 pts/40   00:00:00 /bin/bash
tot       5980  3679  0 12:50 pts/40   00:00:00 /bin/bash
tot       5981  5980  0 12:50 pts/40   00:00:00 ps -f

Sie finden keine Spur von einem Prozess namens myscript, sondern nur vom Kommando ps –f, welches Sie im Shellscript geschrieben haben. Hier sehen Sie, dass unsere Subshell (PID 5980) den Prozess ps –f aufgerufen hat. Die Subshell ist ja schließlich auch unser Interpreter, der das Script myscript Zeile für Zeile abarbeiten soll – was hier auch mit ps –f geschieht.

Beachten Sie aber, dass diese Subshell im Gegensatz zu Ihrer Login-Shell nicht interaktiv arbeitet! Die Subshell arbeitet nur das Shellscript ab und wird anschließend gleich wieder beendet. Es gibt also nach einem interpretierten Kommando keinen Prompt, sondern es wird stur Kommando für Kommando abgearbeitet, bis sich das Shellscript beendet oder mit exit beendet wird.


Rheinwerk Computing

1.9.2 Echte Login-Shell?  toptop

Hier ist immer die Rede von einer Login-Shell. Da ich recht intensiv u. a. mit Linux unter einem Windowmanager (bspw. KDE) arbeite, wird vielleicht der ein oder andere leicht ergraute UNIX-Guru feststellen: Der benutzt ja gar keine echte Login-Shell. Was ist also eine Login-Shell?

Eine Login-Shell ist eine normale Shell, die als erstes Kommando (Prozess) beim Einloggen gestartet wird und beim Hochfahren der kompletten Umgebung (jede Shell hat eine Umgebung) viele andere Kommandos startet. Die Lebensdauer der Login-Shell wird meistens als Session (die Zeit, die man am Rechner eingeloggt ist) bezeichnet.

Eine echte Login-Shell erkennen Sie in der Ausgabe des Kommandos ps daran, dass sich vor dem Namen der Shell ein '' befindet (bspw. –bash; –sh oder –ksh). Es verwirrt vielleicht ein bisschen, da es ja kein Kommando bzw. keine Shell mit –sh oder –ksh gibt. Dies ist allerdings wieder eine Eigenheit der Funktion execl() unter C, bei der eben das Argument vom Kommandonamen nicht gleich dem Argument des Dateinamens sein muss. Setzt man einen Bindestrich vor die Shell, so verhält sich die Shell eben wie eine Login-Shell. Wollen Sie die Login-Shell ändern, sollten Sie sich das Kommando chsh (Abkürzung für change shell) ansehen.


Hinweis Es ist wichtig zu wissen, dass viele Kommandos wie bspw. logout nur in einer echten Login-Shell funktionieren. Dies auch deshalb, weil solche Login-Shells als Eltern den Prozess mit der Nummer 1 auslösen.


Bei der Ausgabe der Scripts im Buch konnten Sie erkennen, dass ich häufig keine echte Login-Shell verwendet habe. Wollen Sie eine echte Login-Shell ausführen, müssen Sie sich im Textmodus anmelden (unter Linux finden Sie einen echten Textmodus mit der Tastenkombination (Strg)+(Alt)+(F1) bis (F6)). Beim Anmelden im Textmodus landen Sie in einer echten Login-Shell – also einer Shell, die sich unmittelbar nach dem Anmelden öffnet.



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