Prozess

Aus Mikiwiki
Zur Navigation springen Zur Suche springen

Der Prozess unterscheidet sich vom Programm dadurch, dass er als Ausführung des Programms betrachtet werden kann; es können mehrere Prozesse desselben Programmes aktiv sein. Jeder Prozess läuft in einem eigenen Adressbereich, der vor anderen Adressbereichen geschützt ist. Ausnahmen bilden Sockets oder die Interprozesskommunikation (IPC).

Jeder Prozess besitzt eine eindeutige Prozessnummer (auch: Prozess-ID / PID), welche über die Befehle pstree, pidof und pgrep angezeigt werden kann. Beim Booten des Systems wird mit der Prozessnummer 0 begonnen. Prozessnummer werden laufend vom System vergeben und sind einmalig. Sie werden gewrappt - bei etwa 32000 ist Schluss und das System beginnt mit der Vergabe von vorn.

Das Prozesssystem ist bei Unix hierarchisch. Mit Ausnahme von Prozessnummer 0 hat jeder Prozess eine Eltern-Prozessnummer (engl. Parent Process ID / PPID) - die PPID ist also die Prozessnummer des Erzeuger-Prozesses. Beispielsweise wird beim Einloggen eine Login-Shell gestartet - alle später in dieser Shell gestarteten Prozesse aus dieser Sitzung sind Kinder dieser Shell. Ein solcher Prozess wird als "process group leader" bezeichnet - stirbt ein solcher Prozess, so sterben im Allgemeinen auch seine Kinder.

Viele Informationen zu laufenden Prozessen finden sich im Verzeichnis "/proc".

Prozessstatus

Ein Prozess befindet sich unter Linux immer in einem der folgenden Zustände, die mit dem Befehl "ps -el" in der Spalte "S" angezeigt werden.

Kürzel Status Beschreibung
D uninterruptible sleep Kann meist nicht mit einfachem kill beendet werden, sondern nur durch Neustart
R running or runnable Der Prozess wird gerade auf dem Prozessor ausgeführt bzw. befindet sich in der Ausführungswarteschlange.
S interruptible sleep Normalzustand - der Prozess ist zur Ausführung bereit.
T traced or stopped Angehalten - entweder durch ein Jobkontrollsignal oder weil der Prozess getracet wird.
Z zombie Zombie-Prozess, der dabei ist, sich zu beenden.
X dead Toter Prozess - ein solcher sollte niemals sichtbar sein.

Der Linux-Kernel verfügt über einen Prozess-Scheduler und eine Speicherverwaltung, um gestarteten Prozessen Rechenzeit und Speicher zuzuteilen. Ein wählbarer IO-Scheduler bringt Zugriffe auf Datenspeicher in eine geeignete Reihenfolge. Das Ressourcenmanagment regelt den Zugriff auf Hardwarekomponenten.

Der Linux-Kernel startet eigene Prozesse. Dazu verwendet er die Funktion "kthread", die alle weiteren Aktionen anschiebt. Viele KDE-Anwendungen hängen von "kdeinit" ab, einem Mechanismus, der die Startzeiten von KDE-Anwendungen verkürzt.

Anzeige der Prozess-ID / PID

Mit pgrep Suche nach der PID der Prozesse, welche die Zeichenfolge "java" enthalten.

$ pgrep -f java

Mit ps Suche nach der PID der Prozesse, welche die Zeichenfolge "java" enthalten.

$ ps -C java -o pid=

Mit ps (und weiteren Befehlen) Suche nach der PID der Prozesse, welche die Zeichenfolge "java" enthalten. Bemerkungen:

  • ps -ef zeigt die Standardausgabe für alle Prozesse
  • grep java findet alle Zeilen, welche die Zeichenfolge "java" enthalten
  • grep -v grep unterdrückt die Zeile, welche die Zeichenfolge "grep" selber enthält
  • awk '{ print $2 }9 zeigt nur die zweite Spalte (die PID) aus der Standardausgabe von "ps -ef" für alle verbleibenden Zeilen
$ ps -ef | grep java | grep -v grep | awk '{ print $2 }'

Mit ps ist auch folgendes möglich.

$ ps -ef | grep [j]ava | awk '{ print $2 }'

Eine Suche nach einer Zeichenfolge wie "java" ist etwas unsicher, da these Zeichenfolge auch in anderen Programmnamen oder Pfaden vorkommen kann, ausserdem kann sie auch in mehreren Zeilen vorkommen. Je genauer der mit "grep" gesuchte Ausdruck, desto besser.

Jobverwaltung

  • jobs zeigt eine Liste der gestarteten Jobs. Der gerade aktuelle Job wird dabei mit einem Pluszeichen markiert.
  • bg legt den aktuellen Job ohne weitere Argumente in den Hintergrund, wo er weiterläuft.
  • fg bringt den Job wieder in den Vordergrund.

Beispiel

Starten des Befehls "du -s /" im Hintergrund (&).

$ du -s / &
[1] 28428

Ansehen des Prozesses 28428 in der Prozesstabelle.

$ ps -lp 28428
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 R  1000 28428 27433  7  80   0 -   843 -      pts/2    00:00:06 du

Hintergrund-Job "[1]" wird in den Vordergrund geholt.

$ fg %1
du -s /

Beobachtung von Prozessen

  • pstree gibt einen Überblick darüber, welcher Prozess welche anderen Prozesse startet.
  • ps zeigt eine Liste aller Prozesse.
  • top zeigt eine Liste der Prozesse und aktualisiert diese regelmässig.
  • strace zeigt, welche Systemfunktionen ein Prozess aufruft.

Unter KDE erreicht man mit "CTRL+Esc" stets die Prozessliste des KDE-Systemwerkzeugs KSysguard. Das GTK-Pendant Gnome-Systemmonitor schlüsselt zusätzlich über das Kontextmenü "Speicherfelder" den von einem Prozess belegten Speicher genauer auf. Dieselben Informationen liefert auch der Befehl pmap.

Signale

Signale bilden einen einfachen Mechanismus zur Prozesskommunikation. Signale sind asynchrone Ereignisse, die von einem Benutzer an der Dialogstation oder von einem Programmfehler erzeugt werden können. Prozesse können unterschiedlich auf Signale reagieren. "kill -l" zeigt eine Liste der möglichen Signale.

Gängige Signale sind:

Name Wert Funktion
HUP 1 Hang-up. Dient oft dazu, Serverdienste anzuweisen, ihre Konfiguration neu einzulesen.
INT 2 Interrupt. Anhalten des Programms. Identisch zu "CTRL+C".
KILL 9 Kill. Prozess zwangsweise beenden.
SIGV 11 Segmentation Fault. Prozess wegen Speicherschutzverletzung zwangsweise beenden.
TERM 15 Terminate. Prozess bitten, sich zu beenden.
CONT 18 Continue. Prozessausführung fortsetzen.
STOP 19 Stop. Prozessausführung anhalten.
TSTP 20 Terminal. Stop. Identisch wie den Prozess mit "CTRL+Z" anzuhalten.

Ein Signal wird an einen Prozess geschickt, deshalb muss erst die Prozessnummer herausgefunden werden. Mit "kill -<Signal> <PID>" wird einem Prozess ein Signal gesendet.

killall und pkill können allen Prozessen mit einem bestimmten Namen oder allen Prozessen eines bestimmten Benutzers ein Signal senden.

KDE kennt für das Signal "KILL" die Tastenkombination "CTRL+ALT+Esc", welche den Mauszeiger in einen Totenkopf verwandelt. Dem Prozess mit dem Fenster, auf das mit der linken Maustaste geklickt wird, schickt KDE das Signal "KILL". Mit der rechten Maustaste kann der Vorgang abgebrochen werden. Die Konfiguration dazu findet sich unter "Regionaleinstellungen & Zugangshilfen > Tastenkürzel > Tastenkombinatione > Allgemeine Tastenkürzel > Verschiedenes > Fenster beseitigen".

Weblinks

Herausgeber Sprache Webseitentitel Anmerkungen
Wikipedia ger Prozess (Informatik)wbm Enzyklopädischer Artikel
Wikipedia eng Process (computingwbm Enzyklopädischer Artikel