Unix für Dawinisten - Kapitel 4
4.   Unix für Fortgeschrittene
4.1. Ein-/Ausgabe-Umleitung
4.2. Job Control
C.   Kommentarformular

4. Unix für Fortgeschrittene

Die in Kapitel 4 erklärten Befehle reichen für den normalen Alltags-Umgang mit Unix aus. Allerdings bietet tUnix noch einige Leckerbissen für (System-)Kenner, die das Arbeiten mit dem Betriebssystem effektiver machen können. Allerdings ist ein wenig Wissen über die internen Abläufe Vorraussetzung, um dabei nicht den Überblick zu verlieren...


4.1. Ein-/Ausgabe-Umleitung und Pipes

Unter Unix gibt es zwei wichtige "Institutionen" und zwar den Standard-Input und den Standard-Output; im Normalfall sind dies die Tastatur und der Bildschirm. Ein Programm wird also normalerweise seine Eingaben vom Standard-Input abholen und seine Ausgaben auf den Standard-Output schreiben.
Unix erlaubt es aber auch, Ein- und Ausgaben umzuleiten, z.B. auf eine Datei. In diesem Fall würde das Programm also seine Eingaben aus einer Datei holen, der Output würde in einer weiteren Datei gespeichert. Dies macht zum Beispiel dann Sinn, wenn man die Ausgabewerte eines Programms ausdrucken möchte: die Daten, die sonst auf den Schirm gelangen würden, landen statt dessen in einer Datei, die anschließend gedruckt werden kann.
Eine Eingabeumleitung ist dann sinnvoll, wenn vorbereitete Parameter aus einer Datei in ein Programm eingegeben werden sollen. Ein Beispiel dafür ist das Abschicken einer Datei mit dem mail-Programm.

Die Syntax ist denkbar einfach: direkt hinter den Programm-Aufruf wird einfach ein größer- oder kleiner-Zeichen gesetzt, und dahinter das Ziel der Umleitung.

- Ausgabeumleitung:
> ziel
Wenn es sich bei ziel um eine bereits existierende Datei handelt, wird sie überschrieben
>> ziel
Wenn die Zieldatei schon existiert, wird die Ausgabe an ihr Ende angehängt; wenn nicht, so wird sie neu erzeugt.
- Eingabeumleitung:
< Quelle
Das Programm liest seinen Input aus der Datei "Quelle"

- Beispiel:
asterix% who > who.txt
Hier wird der output des who-Befehls in die Datei "who.txt" geschrieben.
asterix% cat brief >> post
Die Datei "brief" wird ans Ende der "post"-Datei angehängt.
asterix% mail dawin < brief
Hier wird das mail Programm mit dem Input aus der Datei "brief" gefüttert.
Durch die Ausgabe-Umleitung ist es aber ausserdem möglich, mehrere Programme in einer Kette hintereinander ablaufen zu lassen, einer sogenannten Pipe. Dabei wird der Output des ersten Programms als Input des zweiten verwendet, das zweite gibt seine Ausgaben an das dritte weiter usf.
Eine typische Anwendung ist zum Beispiel die bildschirmweise Anzeige von langen Inhaltsverzeichnissen, indem man den Output des ls-Befehls durch das more-Programm schleust.
Pipes werden unter Unix über das Strich-Symbol "|" verknüpft. Bei Programmen, die normalerweise die Eingabe eines festen Dateinamens erfordern (z.B. tar), gibt man stattdessen ein Minuszeichen "-" an.
- Beispiel:
asterix% ls -l | more
Der Inhalt des aktuellen Verzeichnisses wird seitenweise angezeigt.
asterix% zcat text.Z | more
Die komprimierte Datei "text.Z" wird bildschirmweise angezeigt.
Ein weiteres Einsatzgebiet ist das schnelle Entkomprimieren und Extrahieren eines ".tar.Z"-Archivs in einem einzigen Schritt.
- Beispiel:
asterix% zcat archiv.tar.Z | tar tf - | more
Das Inhaltsverzeichnis des Archivs "archiv.tar.Z" wird seitenweise angezeigt.
asterix% zcat archiv.tar.Z | tar xvf -
Das Archiv wird in einem Schritt entkomprimiert und im aktuellen Verzeichnis ausgepackt.
Natürlich ist es auch möglich, Pipes und Umleitungen zu kombinieren:
- Beispiel:
asterix% zcat archiv.tar.Z | tar tf - > inhalt.txt
Hier wird das Inhaltsverzeichnis des Archivs in die Datei "inhalt.txt" geschrieben.


4.2. Job Control

Unter Unix ist es möglich, mehrere Programme gleichzeitig ablaufen zu lassen. Dabei kann immer nur ein Programm im Vordergrund (foreground) Eingaben von der Tastatur entgegennehmen, während im Hintergrund (background) mehrere Programme entweder "eingefroren" (suspended) oder auch normal ablaufen können. So kann man zum Beispiel, während ein zeitraubender Filetransfer im Hintergrund abläuft, gleichzeitig andere Aufgaben erledigen. Unix stellt nun einige Möglichkeiten zur Verfügung, um Programme (Jobs) zwischen Vorder- und Hintergrund zu bewegen:

Ein Programm einfrieren (suspend): die Tastenkombination <control>+z
Mit <control>+z wird das aktive Programm gestoppt. Anschliessend befindet man sich wieder in der Unix-Shell, aus der man das Programm aufgerufen hat; hier können jetzt ganz normal Unix-Befehle eingegeben und Programme gestartet werden.
Mit dem fg-Befehl kann das eingefrorene Programm wieder in den Vordergrund geholt werden, wo es dann an der Stelle fortfährt, an der es unterbrochen wurde.
Mit dem bg-Befehl kann das Programm aber auch in den Hintergrund geschickt werden, wo es (soweit dies ohne weitere Tastatureingaben möglich ist) weiterarbeitet.

Ein Programm im Hintergrund starten: das &-Suffix
Beim Start eines Programmes kann man am Ende der Zeile das "und"-Zeichen (&) angeben. Das angegebene Programm wird dann automatisch im Hintergrund ablaufen. Mit dem fg-Befehl kann es ggf. in den Vordergrund geholt werden.

- Beispiel:
asterix% compress unix.doc &
Die Datei "unix.doc" wird im Hintergrund komprimiert.
Eine Liste der vorhandenen Jobs anzeigen: das jobs-Kommando
Mit dem Befehl jobs wird eine Liste der Programme angezeigt, die von der aktuellen Unix-Shell aus gestartet wurden. Dabei wird jedem Programm eine Nummer und ein Status zugeordnet. Die Nummer kann in den fg- und bg-Befehlen angegeben werden, der Status zeigt an, in welchem Zustand sich das jeweilige Programm befindet:
- suspended: das Programm ist eingefroren
- running: das Programm läuft im Hintergrund

- Beispiel:
asterix% jobs
[1] + Running compress unix.doc &

Ein eingefrorenes Programm in den Hintergrund schicken: der bg-Befehl
Mit bg (für background) wird das zuletzt eingefrorene Programm (falls nicht anders angegeben) in den Hintergrund geschickt, um dort weiterzuarbeiten.

- Syntax: bg [name | nummer]
Für [name] können die führenden Buchstaben des Programmnamens oder die beim jobs-Aufruf erscheinende Nummer eingesetzt werden.
Ein Programm vom Hintergrund in den Vordergrund holen: der fg-Befehl Mit fg (für foreground) kann ein eingefrorenes Programm, oder eines aus dem Hintergrund wieder in den Vordergrund gebracht werden.
- Syntax: fg [name | nummer]
Eine Liste aller aktuell laufenden Prozesse anzeigen: der ps-Befehl
Mit ps (für process) kann man sich eine Liste aller Prozesse, die man selbst am laufen hat (oder auch die eines anderen Users) anzeigen lassen.
- Syntax: ps [-Optionen]
- Optionen:
-f = (full) zeigt mehr Informationen an
-a = (all) zeigt alle Prozesse an, die auf dem System laufen
-u <username> = zeigt alle Prozesse des angegebenen Users an
- Beispiel:
asterix% ps
PID TTY TIME CMD
28292 pts/6 0:00 -ksh
37519 pts/6 0:00 -sh
57866 pts/6 0:00 ps
Die PID (process ID) ist eine Nummer, unter der das jeweilige Programm angesprochen werden kann (z.B. beim kill-Befehl). TTY steht für den port (Schnittstelle) von der aus der betreffende User eingeloggt ist. TIME ist die effektive Rechenzeit, die der Prozess verbraten hat. Unter CMD wird der Programmname des Prozesses angezeigt.

Einen Prozess abschießen: der kill-Befehl
Falls ein Programm aus irgendeinem Grund nicht beendet werden kann, oder weiterläuft, obwohl der User sich ausgeloggt hat, kann es mit dem kill-Befehl abgebrochen werden. Dazu muss man die PID des abzuschiessenden Prozesses kennen (=> ps-Befehl).
Es ist nicht erforderlich, den kill-Befehl in der selben Session abzuschicken, in der man das zu killende Programm gestartet hat - man kann sich auch von einem anderen Terminal aus erneut einloggen und den Prozess von dort terminieren.
Um allgemeiner Anarchie vorzubeugen, können mit dem kill-Befehl nur solche Prozesse abgeschossen werden, die man selbst gestartet hat (Ausnahme: der Super-User root kann alle Prozesse terminieren).

- Syntax: kill [-Optionen] <PID>
- Optionen:
-9: Ein mit der Option "-9" gestarteter kill-Befehl kann nicht abgefangen werden (Unix-Wizards schießen erst - und stellen dann die Fragen ;-).
-HUP: (hangup) sanfte Version der "-9"-Option - gibt dem Prozeß die Chance, sich selbt ordnungsgemäß zu beenden (und z.B. noch schnell Daten wegzuspeichern)
- Beispiel:
asterix% ps
PID TTY TIME CMD
28292 pts/6 0:00 -ksh
37520 pts/6 0:00 telnet
57866 pts/6 0:00 ps
asterix% kill -HUP 37520
asterix% ps
PID TTY TIME CMD
28292 pts/6 0:00 -ksh
57869 pts/6 0:00 ps