# 1.103.5

# Erzeugung, Überwachung und Terminierung von Prozessen

Beschreibung: Prüfungskandidaten sollten in der Lage sein, Prozesse zu verwalten. Dieses Lernziel beinhaltet das Ausführen von Prozessen in Vorder- und Hintergrund, das Bringen eines Jobs vom Hintergrund in den Vordergrund und umgekehrt, das Starten eines Prozesses, der ohne Verbindung zu einem Terminal laufen soll, und die Mitteilung an ein Programm, daß es nach Abmelden weiterlaufen soll. Ebenfalls enthalten ist die Überwachung aktiver Prozesse, die Auswahl und das Sortieren von Prozessen für die Ausgabe, das Senden von Signalen an Prozesse, das Terminieren von Prozessen sowie das Erkennen und Terminieren von X-Anwendungen, die nach dem Schließen der X-Sitzung nicht ordnungsgemäß beendet wurden.

Die wichtigsten Dateien, Bezeichnungen und Anwendungen:

- `&`
- bg
- fg
- jobs
- kill
- nohup
- ps
- top

### Ausführen von Prozessen im Vorder- und Hintergrund

Prozesse werden von der Shell grundsätzlich im Vordergrund gestartet, indem einfach eine Kommandozeile eingegeben wird. Die Shell wartet dann bis der Prozess beendet ist und kehrt erst danach zur Eingabeaufforderung zurück.

Damit die Eingabeaufforderung sofort wieder zur Verfügung steht, kann ein Prozess im Hintergrund gestartet werden, indem der Kommandozeile einfach ein Ampersand (`&`) angehängt wird.

Dadurch kehrt die Shell sofort wieder zur Eingabeaufforderung zurück, der gestartete Prozess läuft jetzt im Hintergrund.

Diese Ausführungsart eignet sich jedoch nur für Prozesse, die nichts auf die Standard-Ausgabe schreiben (oder deren Ausgaben umgeleitet werden), weil auch die Hintergrundausführung die Ausgaben auf der Standard-Ausgabe belässt. Ein Hintergrundprozeß, der permanent auf den Bildschirm Meldungen ausgibt, ist wohl eher störend.

Häufig wird diese Fähigkeit benutzt, um in der graphischen Oberfläche aus einem XTerm heraus graphische Programme aufzurufen. Durch die Hintergrundausführung kehrt die Shell sofort zur Eingabeaufforderung zurück, das XTerm ist also nicht solange gesperrt, solange das graphische Programm läuft.

### Wechsel zwischen Vorder- und Hintergrundausführung

Die Shell bietet auch Möglichkeiten, Prozesse aus dem Vordergrund in den Hintergrund zu schieben und umgekehrt. Dazu sind fünf Funktionen erforderlich:

Strg-Z
  Hält einen Vordergrundprozess an. Dadurch wird dem Job jegliche Rechenzeit entzogen und die Shell kehrt zur Eingabeaufforderung zurück.
Strg-C
  Killt einen Vordergrundprozess. Dadurch wird der Job beendet und die Shell kehrt zur Eingabeaufforderung zurück.
`bg` [Jobnummer]
  Startet einen angehaltenen Job im Hintergrund. Der Job bekommt wieder Rechenzeit, die Shell kehrt aber zur Eingabeaufforderung zurück.
`fg` [Jobnummer]
  Startet einen angehaltenen Job oder einen im Hintergrund laufenden Job im Vordergrund. Die Shell kehrt nicht mehr zur Eingabeaufforderung zurück.
`jobs`
  Zeigt eine Liste aller Jobs, Vordergrund- Hintergrund und gestoppte Jobs samt ihren JobIDs.

Zusammengefasst kann gesagt werden, daß jede Shell beliebig viele Hintergrundjobs und maximal einen Vordergrundprozess besitzen kann. Mit den oben genannten Funktionen ist es möglich jede beliebige Kombination herzustellen. Die Befehle `fg, bg` und `jobs` sind eingebaute Shellfunktionen. Wichtig ist die Unterscheidung zwischen JobID und ProzessID. Die JobID bezieht sich auf die jeweilige Shell, die ProzessID ist von überall her gültig und im ganzen System eindeutig.

### Prozesse unabhängig von der Terminalsitzung starten

Normalerweise wird ein Programm von einer Shell aufgerufen. Die Shell startet dann einen weiteren Prozeß, dessen Elternprozeß sie selbst darstellt. Wenn die Shell jetzt beendet wird, etwa durch ein exit, durch ein Strg-d oder den Befehl logout, wird der neu gestartete Befehl dadurch automatisch auch beendet.

In manchen Fällen kann es jedoch auch gewünscht sein, daß ein Prozeß auch nach dem Abmelden weiterläuft. Diese Möglichkeit bietet uns das Programm nohup. Es startet einen Befehl, und ignoriert dann das Hangup-Signal (SIGHUP) für diesen Prozeß. Dieses Signal wird gewöhnlich beim Abmelden an alle Prozesse gesendet, um ihnen mitzuteilen, daß die Sitzung jetzt geschlossen wird. (Hangup steht für Auflegen, also das Beenden einer Modemverbindung)

Die Aufrufform von nohup ist einfach, außer den Kommandozeilenparametern `--help` und `--version` existieren keine weiteren Schalter. Dem Programmnamen wird einfach der Name des zu startenden Befehls mitgegeben:

      nohup Befehl

Dadurch wird der angegebene Befehl ausgeführt, und bleibt auch nach dem Abmelden weiter aktiv im Speicher. Die Ausgaben des gestarteten Prozesses werden nicht mehr auf die Standard-Ausgabe geschrieben (weil die ja nach dem Abmelden gar nicht mehr zur Verfügung steht), sondern an die Datei `nohup.out` angehängt. Der Prozeß hat also seine Verbindung zum Terminal verloren, er kann nur noch über seine ProzeßID angesprochen werden.

### Überwachung von Prozessen

Laufende Prozesse können überwacht werden mit den Programmen ps und top.

Das Programm ps bietet einen Schnappschuß der gerade laufenden Prozesse. Es zeigt verschiedene Daten dieser Prozesse an, das wichtigste ist dabei die ProzessID (PID) des jeweiligen Prozesses. Ohne Parameter aufgerufen zeigt ps nur die eigenen Prozesse. Häufige Kombinationen von Parametern sind

`ps uax`
  Zeigt eine Liste aller (a) Prozesse des Systems inclusive der Angabe der User (u) denen die Prozesse gehören, es werden auch daemon-Prozesse ohne eigenes Terminal (x) angezeigt.
`ps fax`
  Zeigt eine Liste aller (a) Prozesse des Systems wieder mit den daemon-Prozessen (x) an. Die Prozesse werden als Baumstruktur (f) angezeigt, die klar macht, welche Prozesse von welchen Eltern-Prozessen abstammen.

Im Gegensatz zu ps zeigt top eine ständig aktualisierte Liste der Prozesse mit der höchsten CPU-Auslastung. Top ist ein interaktives Programm, das auch Modifikationen der Prozesse zulässt. top läuft solange, bis es mit q beendet wird.

### Ansprechen und Beenden von Prozessen

Unter Linux können laufende Prozesse angesprochen werden, genauer gesagt können ihnen Signale geschickt werden. Wie die jeweiligen Prozesse auf Signale reagieren hängt davon ab, was der Programmierer des jeweiligen Programms vorgesehen hat.

Die wichtigste Aufgabe von Signalen ist es, Prozesse zu beenden. Das Programm zum Versenden von Signalen heißt daher folgerichtig kill. Es gibt aber auch viele andere Aufgaben für Signale, so kann etwa ein Prozess durch ein Signal dazu aufgefordert werden, siene Konfigurationsdatei neu einzulesen. Damit kann ein laufender Prozess verändert werden, ohne ihn neu starten zu müssen.

Das Programm kill erwartet eine oder mehrere ProzessIDs als Parameter, die die Prozesse beschreiben, denen das Signal geschickt werden soll. Wenn kein spezielles Signal angegeben wird, so schickt kill den Prozessen das Signal Nr. 15 (SIGTERM), das einen Prozess auffordert, sich selbst zu beenden. Es gibt ein Signal, das immer "tödlich" ist, es hat die Nummer 9 (SIGKILL).

Die Syntax von kill ist einfach:

      kill [-Signal] PID [PID ...]

Ein Parameter, mit führendem Bindestrich wird als Signal interpretiert, alle anderen als PIDs. Signale können entweder in ihrer numerischen Form oder über ihern Namen angegeben werden - also z.B. entweder `-9` oder `-KILL`.

Eine Liste aller unterstützten Signale bekommen Sie mit `kill -l`