orm@doc-tcpip.org

Erstellt: Februar 1999 - Letzte Modifikation: November 2001

[ Main | Local ]


Die Kontrolle mehrerer Jobs auf einem Terminal


Wie kontrolliere ich unter Unix mehrere Prozesse?

Die Kontrolle mehrerer Prozesse ist ein Teil von Unix und fast genauso alt wie Unix selbst. Das ist durchaus bemerkenswert, wenn man bedenkt, wie lange es soetwas bei anderen OSen nicht gegeben hat - man denken an Windows oder MAC.

Unter Unix kann man einen Prozess gleich in den Hintergrund schicken. Der Prozess gibt dann die Kontrolle über die Shell ab, sodaß man normal weiterarbeiten kann. Das geschieht, indem man den Prozess mit einem Ampersand (&) startet. Das System ordnet dann eine Jobnummer zu und gibt diese beim Start und der Terminierung des Prozesses aus:

START:

$ mein_prozess &
[1] mein_prozess

TERMINIERUNG:
Ist der Job durch: Exit Status 0 ist ok:
[1]+ Done
Exit Status anders:
[1]+ Exit 1 mein_prozess

Ein Prozess, der schon läuft und das Terminal blockiert, muß man zuerst anhalten, um ihn dann in den Hintergrund zu schicken. Das Stoppen des Prozesses erfolgt mit CTRL-Z. Setzt man dann das bg-Kommando ab, geht der Prozess in den Hintergrund. Setzt man in der Shell das fg-Kommando ab, so wird der letzte in den BG geschickte Prozess wieder hochgeschickt.

fg %mein_prozess
fg %
fg PID

Wie sehe ich jetzt, welche Jobs laufen? Dazu dient das jobs-Kommando. Dieses erlaubt es, die laufenden Jobs zu steuern. Folgende Schalter sind meistens vorhanden:

Wenn man viele Jobs gleichen Namens hat (aber mit verschiedenen Argumenten): %? => Sucht entsprechenden Job mit String in der Argumentenliste. % => Sucht Job mit String am Beginn der Argumentenliste.

Einen Job stoppt man mit einer Steuer-Sequenz: CTRL-Z stoppt einen laufenden Prozess, der im Vordergrund lief und das Terminal blockierte. Man erhält dann eine Rückgabe dieser Art: [1]+ stopped mein_prozess. Danach hat man seinen Prompt wieder. Der Prozess lebt natürlich noch, und man kann ihn jetzt mit fg wieder anlaufen lassen oder ihn mit bg in den Hinterschicken.

Das ist praktisch, wenn man z.B. ein Latex-Eingabe File oder Source Code editiert:

vi xxxx
CTRL-Z
latex oder Programm-Testlauf ==> Fehler
fg
und weiterarbeiten.....

Hier eine Liste der gängisten Steuer-Sequenzen:

  • CTRL-Y Prozess stoppt, wenn er vom Terminal lesen möchte.
  • CTRL-XXX sind Signale, die man Prozessen schicken kann. Liste aller Signale: kill -l Die Namen sind in der Regel zuverläßiger als die Nummern, wenn man auf andere Plattformen geht.
  • CTRL-C INT
  • CTRL-Z TSTP Terminal Stop
  • CTRL-X QUIT (wie C, macht aber Coredump - wenn C nicht geht)
  • CTRL-D eof Input Ende
  • CTRL-S stop Ausgabe auf dem Terminal halten
  • CTRL-Q weiter machen
  • CTRL-? erase Einen Character löschen
  • CTRL-U Kommandozeile löschen
CTRL-Keys setzt man mit dem Kommando stty: stty signame char. Kontrolkeys sind ziemlich alt und stammen vom Konzept her aus Terminal-Zeiten. Heute gibt es in der Regel deutlich bessere Möglichkeiten.

Jobs killen

Das Kommando kill %1 (ist wie kill PID, klar) killt den entsprechden Prozess. Es gibt folgende Rückgabe: [1]+ Terminate mein_prozess. Technisch schickt die Shell ein TERM Signal an den Prozess.

Es gibt Prozesse, die mit einem TERM Signal umgehen können und es abfangen. Dann kann man den Prozess (Job) mit kill -QUIT killen. In der Rückgabe findet sich dann ein Fehlerkode: [1]+ Exit 131.

Shell Skripte zählen Error-Codes ab 128. 131 ist also Code 3, weil QUIT das Signal 3 ist.. Das hängt alles stark vom Unix ab....


[ Main | Local ]

[ Allgemein | UNIX | AIX | TCP-IP | TCP | ROUTING | DNS | NTP | NFS | FreeBSD | Linux | SMTP | Tracing | GPS ]

Copyright 2001-2014 by Orm Hager - Es gilt die GPL
Feedback bitte an: Orm Hager (orm@doc-tcpip.org )