Gefällt dir dieser Artikel?

Linux: Prozess pausieren

erschienen in der Kategorie Software, am 03.08.2015
Schnatterente
Gerade Linux-Nutzer mit älterer Hardware kennen sicher das Problem, dass sie einen sehr rechenaufwendigen Prozess am Laufen haben und dieser das ganze System oder zumindest Teile der grafischen Benutzeroberfläche lahmlegt.

Wenn man dann mal schnell etwas anderes am PC machen will oder kurzfristig mehr CPU-Zeit für eine andere Anwendung braucht, wird es echt nervig. Doch das muss gar nicht sein. Denn was viele Linux-Anwender nicht wissen: Man kann Linux-Prozesse einfach anhalten und später fortsetzen.

Besonders relevant ist das Anhalten von Prozessen sicherlich auch für Nutzer von Linux-Distributionen wie Gentoo oder Exherbo, bei denen Programme nicht einfach als fertige Binary ausgeliefert, sondern immer erst auf dem System kompiliert werden. Bei der Kompilierung von großen Paketen ist der Rechner dann schnell mal für mehrere Stunden ausgelastet. (Meine persönlichen Lieblinge heißen da gcc, chromium und webkit-gtk - da ist Zeit für viele Tassen Kaffee.)

Wie hält man einen Linux Prozess an?

In der Regel werden zwei Möglichkeiten genannt, wie man einen Prozess anhalten kann. Ich will beide Varianten kurz aufzeigen. Die zweite Möglichkeit wird oft missverstanden bzw. es wird einfach nicht hinterfragt, worin der Unterschied zur ersten Variante besteht. Aber beginnen wir erst einmal mit der unverfänglichen Methode ...

Prozess anhalten mittels Strg + z und Fortsetzen mit fg oder bg

Um einen Prozess anzuhalten, kann man, während er in der Konsole vor sich hinrechnet, einfach die Tastenkombination Strg + z drücken. Linux meldet darauf hin
[1]+ Angehalten

und setzt den Cursor in die nächste Befehlszeile der Shell. Man kann die offene Konsole also gleich für eine andere Operation weiterverwenden.

Um die Arbeit später wieder aufzunehmen, gibt man einfach fg ein. Der Prozess wird daraufhin an der Stelle fortgesetzt, an der man ihn unterbrochen hat.

Hat man mehrere Prozesse pausiert, muss man noch die Nummer des fortzusetzenden Prozesses ergänzen: "fg 1". In diesem Fall wird jener Prozess fortgesetzt, der zuerst pausiert wurde (oben erkennbar an der Nummer 1).
Sind mehrere Programme gestoppt und man gibt nur fg (ohne die Nummer des angehaltenen Prozesses) ein, arbeitet Linux den Stack rückwärts ab. Das heißt, es wird zuerst das Programm fortgesetzt, dass man zuletzt gestoppt hat.

Alternativ zu fg kann man zum Fortsetzen von Prozessen auch den Befehl bg verwenden. Der Prozess wird dann nicht im Vordergrund ("foreground"), sondern im Hintergrund ("background") fortgeführt. Man kann dann das Terminal für neue Aufgaben verwenden, während der Prozess im Hintergrund arbeitet. Produziert der Hintergrundprozess Ausgaben, werden diese aber dennoch angezeigt. (Das kann dann auch mal verwirrend sein, wenn sich die Ausgaben mehrerer Programme auf der Konsole vermischen.) Mit dem fg-Kommando kann man den Hintergrundjob jederzeit wieder in den Vordergrund holen.

Wenn man den Überblick über seine angehaltenen Prozesse verloren hat, gibt man einfach jobs ein und erhält eine Übersicht.

Außerdem sollte man noch wissen, dass sich alles hier gezeigte immer nur auf die jeweils genutzte Terminal-Sitzung bezieht. Das heißt, wenn man ein zweites Terminal öffnet, hat man in diesem keinen Zugriff auf die pausierten Jobs des anderen Terminals. Und das bedeutet ebenso, dass man ein Terminal nicht einfach schließen darf, wenn man noch Jobs im Wartezustand hat - die sind dann nämlich einfach weg.

Prozess "anhalten" mittels Strg + s und Fortsetzen mittels Strg + q

Kommen wir zur zweiten Variante, wie man einen Prozess stoppen kann - wobei diese Aussage so schon gar nicht stimmt. :)

Man findet hier und da den Hinweis, dass sich Linux-Prozesse mit der Tastenkombination Strg + s anhalten und mit Strg + q fortsetzen lassen. Das funktioniert tatsächlich, wird aber oft missverstanden.

Strg + s hält den Prozess nicht wirklich an. Das Kommando ist dazu da, die Ausgabe auf der Konsole anzuhalten. Der eigentliche Prozess läuft dabei weiter. Dem entsprechend bleibt die Ausgabe auf der Konsole einfach stehen und der Cursor springt nicht in die nächste Befehlszeile. Das Terminal kann nicht zur Ausführung anderer Befehle genutzt werden.
Der (zumindest optisch) angehaltene Prozess läuft also im Hintergrund weiter und verbraucht weiter Rechenzeit. In der Prozessliste verbleibt er auch im Zustand R (Running) und geht nicht, wie es in Variante 1 der Fall wäre, in den Zustand T (Stopped) über.
Erst wenn der Prozess an eine Stelle kommt, an der er eine Ein-/Ausgabe-Aktion mit der Konsole durchführen will, muss er seine Rechenoperationen einstellen. Er verbraucht ab diesem Punkt keine CPU-Zeit mehr und muss warten, bis der Nutzer die Konsole wieder (mittels Strg + q) freigibt.

Nutzt man Strg + s zum Anhalten eines Kompilierungsvorganges, bei dem alle durchgeführten Operationen auf der Konsole protokolliert werden, so hat dies in der Regel den Effekt, dass der aktuelle Kompilierungsschritt noch fertiggestellt wird, bevor der Prozess zum Anhalten gezwungen wird. Unter Umständen kann es folglich eine ganze Weile dauern, bis die CPU-Last nachlässt.

Die Tastenkombination Strg + s ist also dafür da, die Ausgabe anzuhalten und nicht um einen Prozess zu stoppen. Die Variante hat den Nachteil, dass der Prozess erst dann wirklich anhält, wenn er Zugriff auf die Konsole benötigt. Unter Umständen kann es sein, dass dies niemals der Fall ist.


Aus den genannten Gründen sollte man sich also zum Anhalten von Prozessen eher die erste Methode einprägen. Variante 2 kann man sich für den Fall merken, dass man die Konsole einfrieren will, um etwas zu lesen und dabei zu verhindern, dass es vom nächsten Output verdrängt wird.

Geschnatter

8 Kommentare, selbst mitschnattern << < Seite 1/2 > >>
uwe, am 03.08.2015 um 15:07 Uhr
Danke, das habe ich mittlerweile seit Jahren aus den Augen verloren gehabt ;-)
Sebastian, am 03.08.2015 um 15:50 Uhr
Vielleicht kann man noch betonen, dass Strg+z und bg dazu genutzt werden kann, ein im Vordergrund laufendes Programm in den Hintergrund zu verschieben. Das ergibt sich zwar aus dem Text, mag dem einen oder anderen so aber gar nicht auffallen.
postlet, am 03.08.2015 um 15:54 Uhr
Kann ich mich dem uwe nur anschließen, schöner Artikel, der das nochmal ins Gedächtnis ruft. Und bestimmt auch sehr interessant mal zu wissen für alle, die noch nicht so in Linux drinstecken. Von solchen Artikeln kannst du gerne mal mehr bringen!
Luyin, am 03.08.2015 um 16:58 Uhr
Cool, vielen Dank für den Tipp. Das mit Strg+S war mir komplett neu. Hätte zu Gentoo-Zeiten sicherlich geholfen, da bekommt man ja immer einiges an Ausgabe beim Kompilieren. :-)

Ansonsten wäre ein nützlicher Tipp sicher das Verwenden eines Terminalmultiplexers wie screen oder tmux.

Herzliche Grüße!
Hans, am 04.08.2015 um 21:49 Uhr
Schöner Beitrag, danke dafür!
Anonym, am 15.08.2015 um 12:40 Uhr
DANKE, bin auf die Seite gekommen, weil ich gerade aus Versehen eine der Tastenkombinationen gedrückt hatte und nicht wusste, wie ich meine Software zum Weiterlaufen bewegen kann :D
Prozess erfolgreich angehalten, am 16.08.2015 um 12:48 Uhr
Danke, das hat mir sehr geholfen!