Das Unix-Prozess-System

> Betriebssystem Linux

> > # Befehle für das Prozeß-System

> > Natürlich bietet Unix diverse Befehle an, die das Prozeß-System betreffen. Die wichtigsten sind hier kurz erklärt:

> > ### 1 Befehle zum Auflisten der laufenden Prozesse

> > #### 1.1 ps

> > Um alle Prozesse aufzulisten, die gerade laufen, gibt es den Befehl ps (Process-Status), der zunächst mal nur die eigenen Prozesse auflistet. ps stellt aber immer nur eine Momentaufnahme dar, d.h., es werden genau die Prozesse aufgelistet, die im Augenblick laufen. Dynamische Veränderungen sind nicht darstellbar.

> > ps kennt eine ganze Menge verschiedener Kommandozeilenparameter (Schalter) die sein Verhalten entsprechend ändern können. Die wichtigsten sind:

> > l | Langes Format
> > u | User Format (Mit User und Startzeit)
> > a | Alle Prozesse, auch die anderer User
> > x | Auch Daemon-Prozesse (Ohne eigene TTY-Leitung)
> > f | Forest (Wald) Format - Der Prozessbaum wird dargestellt
> > w | Wide (breite) Ausgabe - Zeilen werden nicht abgeschnitten

> > So kann also mit dem Befehl

> > ps uax

> > eine Liste aller Prozesse ausgegeben werden, die insgesamt auf dem System laufen, auch die anderer User (a) und Daemonprozesse (x). Sie werden zusammen mit dem Namen ihres Eigentümers (u) dargestellt.

> > Um das gleiche Ergebnis als Baumstruktur zu bekommen kann

> > ps fax

> > benutzt werden. Die einzelnen Felder sind identisch mit den weiter unten dargestellten Feldern des top-Befehls.

> > #### 1.2 top

> > Wenn statt der Auflistung der Momentaufnahme eine ständig aktualisierte Liste gewünscht wird, so ist das Programm top das benötigte Werkzeug. Dieses Programm gibt eine Liste der Prozesse aus und aktualisiert diese nach einer bestimmten Wartezeit (voreingestellt sind 5 Sek). Der Nachteil ist, dass nur soviele Prozesse aufgelistet werden, wie auf den entsprechenden Bildschirm passen. Eine vernünftige Anwendung ist somit nur in einem entsprechend großem xterm-Fenster möglich.

> > Als Programm, das interaktiv benutzbar ist, hat top natürlich auch Befehlstasten, die den Ablauf verändern. Die folgenden Tasten sind die wichtigsten Befehle:

> > Leertaste | Sofortiges Update der Prozesse
> > Strg-L | Bildschirm neu aufbauen
> > h oder ? | Darstellung einer Hilfeseite
> > i | Ignoriere schlafende und Zombie-Prozesse (i ist ein Wechselschalter, erneutes Drücken bewirkt, dass diese Prozesse wieder angezeigt werden.
> > r | Renice - Damit kann einem Prozeß ein neuer Nice-Wert gegeben werden (sofern der User das Recht dazu hat). Das Programm fragt nach PID und Nice-Wert.
> > k | Kill - Entspricht dem Programm kill - siehe weiter unten. Damit können Signale an Prozesse geschickt werden.
> > s | Damit kann die Zeit verändert werden, die zwischen dem Auffrischen des Bildschirms gewartet wird. Eingabe in Sekunden. Vorsicht, eine zu kurze Zeit bringt den Rechner schnell in die Knie. Eine 0 steht für dauernde Neudarstellung ohne Wartezeit, Voreingestellt sin meist 5 Sekunden.
> > f | Fügt Felder in die Ausgabe ein oder entfernt sie. Die einzelnen Felder werden weiter unten erklärt.
> > W | Schreibt die aktuelle Konfiguration in die Datei ~/.toprc - Damit wird nach dem Neustart von top diese Konfiguration wieder geladen.
> > q | Quit - Beendet das Programm

> > top kann verschiedene Felder darstellen, die mit dem f-Befehl ausgewählt werden können. Die einzelnen Felder haben folgende Bedeutung:

> > PID | Die Process-ID des Prozesses
> > PPID | Die Parent Process ID des Prozesses
> > UID | Die User ID des Users, dem der Prozeß gehört
> > USER | Der Username des Users, dem der Prozeß gehört
> > PRI | Die Priorität des Prozesses. Höhere Werte bedeuten höhere Priorität.
> > NI | Der Nice-Wert des Prozesses. Höhere Werte bedeuten geringere Priorität.
> > SIZE | Die Größe des Codes plus Daten plus Stack in KiloByte
> > TSIZE | Die Größe des Codes in KiloByte. ELF Prozesse werden nicht korrekt dargestellt
> > DSIZE | Die Größe der Daten und Stack in Kilobyte. ELF Prozesse werden nicht korrekt dargestellt
> > TRS | Text Resident Size - Die größe des residenten Code-Blocks in KiloByte
> > SWAP | Größe des ausgelagerten Bereichs des Tasks
> > D | Größe der als Dirty markierten Speicherseiten
> > LIB | Größe der Library-Speicherseiten - Funktioniert nicht bei ELF-Prozessen.
> > RSS | Die Größe des physikalische Speichers, den das Programm benutzt. Für ELF-Format werden hier auch die Libraries mitgezählt, bei a.out Format nicht.
> > SHARE | Die Größe der benutzten Shared-Libraries des Prozesses.
> > STAT | Der Status des Prozesses. Das kann entweder ein S für schlafend, D für ununterbrechbar schlafend (dead), R für laufend (running) oder T für angehalten (traced). Dieser Angabe kann noch ein < für einen negativen Nice-Wert, ein N für einen positiven Nice-Wert oder ein W für einen ausgelagerten Prozeß folgen. (Das W funktioniert nicht richtig für Kernel-Prozesse)
> > WCHAN | Die Kernelfunktion, die der Task gerade nutzt.
> > TIME | Die gesamte CPU-Zeit, die der Prozeß verbraucht hat, seit er gestartet wurde.
> > %CPU | Die CPU-Zeit, die der Prozeß seit dem letzten Bildschirm-Update verbraucht hat, dargestellt als Prozentsatz der gesamten CPU-Zeit.
> > %MEM | Der Anteil des Speichers, den der Task nutzt.
> > COMMAND | Das Kommando, mit dem der Prozeß gestartet wurde.
> > TTY | Die Terminalleitung des Prozesses.

> > ### 2 Befehle für die Inter-Process-Communikation

> > Die folgenden Befehle, die alle Signale an Prozesse schicken sind in ihrer Handhabung für den Normaluser eingeschränkt. Der Normaluser darf selbstverständlich nur die Prozesse ansprechen, die ihm gehören, die er also selbst aufgerufen hat. Nur der Systemverwalter (root) darf auch Prozessen anderer User solche Signale schicken.

> > #### 2.1 kill

> > Mit dem kill-Befehl kan man einem oder mehreren Prozessen Signale schicken. Diese Signale können den Prozeß dann dazu bewegen, bestimmte Aktionen vorzunehmen. Der Befehl kill erwartet als Parameter zuerst das zu sendende Signal (mit vorgestelltem Bindestrich), entweder als Zahl oder als symbolischer Name, dann die PID des Prozesses, dem es geschickt werden soll. Es können auch mehrere ProzeßIDs angegeben werden.

> > Mit kill -l erhält man eine Liste der gültigen Signale, bei Linux sind das in der Regel die Folgenden:

> > 1) SIGHUP | 2) SIGINT | 3) SIGQUIT | 4) SIGILL
> > 5) SIGTRAP | 6) SIGABRT | 7) SIGBUS | 8) SIGFPE
> > 9) SIGKILL | 10) SIGUSR1 | 11) SIGSEGV | 12) SIGUSR2
> > 13) SIGPIPE | 14) SIGALRM | 15) SIGTERM | 17) SIGCHLD
> > 18) SIGCONT | 19) SIGSTOP | 20) SIGTSTP | 21) SIGTTIN
> > 22) SIGTTOU | 23) SIGURG | 24) SIGXCPU | 25) SIGXFSZ
> > 26) SIGVTALRM | 27) SIGPROF | 28) SIGWINCH | 29) SIGIO
> > 30) SIGPWR |  |  |

> > Diese Signale haben, bis auf das Signal Nr. 9 (SIGKILL) und 15 (SIGTERM), keine festgelegte Bedeutung. Der Programmierer eines Programms kann festlegen, wie das Programm auf ein bestimmtes Signal reagieren soll. Das Signal 15 ist das voreingestellte Signal, das geschickt wird, wenn dem kill-Befehl kein Signal angegeben wird und fordert ein Programm auf, sich zu beenden. Ein Prozeß muß aber nicht zwangsläufig abbrechen, wenn es dieses Signal empfängt. Das Signal 9 hingegen ist der "Todesschuß", diesem Signal kann sich kein Prozeß entziehen.

> > #### 2.2 skill

> > Der Befehl skill arbeitet im wesentlichen wie kill, nur dass er sich nicht auf Prozeß-IDs bezieht, sondern auf Namen von Programmen, Usern oder TTY-Leitungen. Das heißt, skill schickt ein bestimmtes Signal an alle Programme eines Namens, alle Prozesse eines Users oder alle Prozesse, die ein bestimmtes Terminal benutzen. Die Aufrufform ist wie bei kill, zunächst das Signal, wie bei kill mit vorgestelltem Bindestrich, entweder als symbolischer Name (z.B. -HUP oder -SIGHUP) oder als Nummer (-1). Dann folgen aber nicht PIDs sondern die Namen der Programme, User oder TTYs. Der Befehl

> > skill -9 hans

> > schickt also allen Prozessen, die dem User hans gehören das tödliche Signal Nummer 9. Oder um alle Prozesse zu beenden, die auf der Terminalleitung TTY4 laufen, reicht es zu schreiben:

> > skill -9 TTY4

> > Das hat natürlich den Haken, dass es z.B. Programme geben kann, die den gleichen Namen wie User tragen. Um also Verwechslungen auszuschließen, kann dem Usernamen ein -u vorgestellt werden, dem Programmnamen ein -c (command), einer PID ein -p und dem Namen der Terminalleitung ein -t. Diese Angaben sind kombinierbar.

> > Um sicherzustellen, dass es in den beiden obigen Beispielen nicht zu Verwechslungen kommen kann wäre es also besser zu schreiben:

> > skill -9 -u hans
> > skill -9 -t TTY4

> > #### 2.3 snice

> > Der Befehl snice ist nah verwandt mit skill, nur dass er statt ein Signal an Prozesse eines Users, eines Namens oder einer TTY-Leitung eben deren Nice-Wert ändert. Wie früher schon erklärt ist der Nice-Wert eines Prozesses der Wert, wie nett ein Prozeß zu anderen Prozessen ist, wie viel Rechenzeit er also benutzt. Je höher der Wert, umso niedriger die Priorität. Nur der Systemverwalter darf einem Prozeß einen negativen Nice-Wert geben.

> > Der Befehl

> > snice +10 -p 1034

> > stellt den Nice-Wert des Prozesses mit der PID 1034 auf +10 ein.

> > #### 2.4 killproc

> > Der Befehl killproc schickt, ähnlich wie skill, Signale an Prozesse, aber er schickt sie an alle Prozesse, die von genau einem Programm abstammen. Als zweiten Parameter erwartet er also den vollen Pfad zu einem Programm, und schickt dann das angegebene Signal an alle Prozesse, die dieses Programm laufen lassen. Er entspricht damit fast dem Befehl

> > skill -SIGNAL -c Programmname

> > mit dem Unterschied, dass skill sich hier nur um den Namen kümmert, nicht um den Pfad. Wären also im System zwei Programme gleichen Namens, eines heißt /home/hans/prog1, das andere /home/otto/prog1, beide Programme sind gerade geladen und laufen, so würde ein

> > skill -9 -c prog1

> > beide Prozesse killen. Der Befehl

> > killproc -9 /home/hans/prog1

> > schickt aber das Signal 9 nur an das eine von beiden.

> > [ Kurs Hauptseite ] [ Linux-Kurse ] [ Startseite Linux-Praxis ]

> > © 1999, 2000, 2001 by F. Kalhammer