next up previous contents index
Next: Systemabsturz Up: Prozeßordnung Previous: Prozeßordnung

Abstürzende Programme und hängende Prozesse

Es gibt kein fehlerfreies Programm und überall Benutzer, die einem sonst sehr zuverlässigen Programm ganz erstaunliches und unerklärliches Verhalten entlocken, und es gibt das Naturgesetz von Murphy ...

Deshalb kommt es mit Sicherheit bei jedem Rechner irgendwann einmal zu einem Programmabsturz.

Aber nicht jedes fehlerhafte Programm führt gleich zu einem kompletten Systemabsturz. Durch die Architektur des Betriebssystems hat jedes Programm seinen eigenen, geschützten Speicherbereich, in den kein anderes Programm schreiben oder hineinsehen darf. Beim Versuch, auf den Speicherbereich eines anderen Programms zuzugreifen, wird jedes Programm sofort mit dem SIGSEGV Signal abgebrochen. Dieses Programm wird dadurch sofort aus dem Arbeitsspeicher gelöscht und kann keinen Schaden mehr anrichten.  

Wenn ein Programm wegen eines solchen Fehlers vom Betriebssystem abgebrochen werden muß, wird automatisch ein Speicherabzug (core) des gesamten   Speicherbereiches des Prozesses auf der Festplatte im aktuellen Verzeichnis abgelegt. Die maximale Größe dieses Speicherabzuges kann mit dem ulimit-Kommando begrenzt werden.

Viel öfter passiert es, daß ein Prozeß sich äufhängt''. So ein Prozeß arbeitet noch irgendwie, ist aber über die Tastatur nicht mehr ansprechbar. Oder die Ausgabe des Programms findet den Weg zum Bildschirm nicht mehr. Wenn nicht einmal ein ^C mehr hilft, können solche Prozesse bei einigen anderen Betriebssystemen nur durch einen Reset des Rechners beendet werden. Bei Linux (oder Unix) kann im Prinzip jeder Prozeß von einem anderen Terminal aus beendet werden,   indem ihm mit dem kill-Kommando ein Signal zum Aufhören gesendet wird. Das kill-Kommando kann jeder Anwender nur für seine eigenen Prozesse benutzen. Nur die Superuserin kann alle Prozesse ''killen''.

Der drastische Ausdruck trifft nicht genau den Kern von kill, denn es gibt  eine ganze Reihe von Signalen, die dem Prozeß, der sie erhält, nicht gleich das ganze Leben entziehen. Vielmehr können viele dieser Signale von den Programmen, die sie erhalten, `abgefangen' und sinnvoll bearbeitet werden. Um dem Benutzer (und dem Programm) die Möglichkeit einer differenzierten Reaktion zu geben, stehen für das kill-Kommando 23 verschiedene Signale zur Verfügung.

Das Standardsignal ist SIGTERM (15), die Aufforderung zu terminieren. Andere häufig verwendete Signale sind SIGHUP (1), das die Unterbrechung einer   Terminalverbindung signalisiert, oder SIGINT (2), das auch durch die    Tastenkombination CONTROL-C (^C) erzeugt wird und in vielen Programmen von einer Routine abgefangen wird.

In der Regel werden die Programme freiwillig'' die Bühne verlassen, wenn sie von kill ein solches Signal erhalten haben. Erst wenn das nichts mehr hilft, kann mit dem Signal SIGKILL (9) jeder (eigene) Prozeß ohne die Möglichkeit   einer Reaktion beendet werden.

Das kill-Kommando benötigt natürlich in der Kommandozeile eine Identifikation des Prozesses, an den das Signal geschickt werden soll. Dazu kann jedes kill-Kommando die Prozeßnummer dieses Prozesses verarbeiten. Um diese Prozeßnummer ( PID) herauszubekommen, kann das ps-Kommando benutzt werden. Mit der Option ` -ax' zeigt es alle Prozesse mit ihren Prozeßnummern, den Terminals, falls sie noch kontrollierende Terminals haben, dem Status und dem Namen an.



next up previous contents index
Next: Systemabsturz Up: Prozeßordnung Previous: Prozeßordnung



Linux Anwenderhandbuch -- Copyright 1993, 1994, 1995 S. Hetze, D. Hohndel, O. Kirch, M. Müller