So führen und steuern Sie Hintergrundprozesse unter Linux

Verwenden Sie die Bash-Shell in Linux, um Vordergrund- und Hintergrundprozesse zu verwalten. Sie können die Jobsteuerungsfunktionen und -signale von Bash verwenden, um Ihnen mehr Flexibilität bei der Ausführung von Befehlen zu geben. Wir zeigen Ihnen wie.

Alles über Prozesse

Immer wenn ein Programm in einem Linux- oder Unix-ähnlichen Betriebssystem ausgeführt wird, wird ein Prozess gestartet. „Prozess“ ist die Bezeichnung für die interne Darstellung des ausführenden Programms im Speicher des Computers. Für jedes aktive Programm gibt es einen Prozess. Tatsächlich gibt es für fast alles, was auf Ihrem Computer ausgeführt wird, einen Prozess. Dazu gehören die Komponenten Ihres grafische Desktop-Umgebung (GDE) wie GNOME oder KDE, und system Dämonen die beim Start gestartet werden.

Warum fast alles, was läuft? Nun, Bash-Integrationen wie CD, pwd, und alias Sie müssen keinen Prozess gestartet (oder „gespawnt“) haben, wenn sie ausgeführt werden. Bash führt diese Befehle innerhalb der Instanz der Bash-Shell aus, die in Ihrem Terminalfenster ausgeführt wird. Diese Befehle sind gerade deshalb schnell, weil für ihre Ausführung kein Prozess gestartet werden muss. (Sie können help in ein Terminalfenster eingeben, um die Liste der Bash-Integrationen anzuzeigen.)

Prozesse können im Vordergrund laufen, dann übernehmen sie Ihr Terminal bis sie abgeschlossen sind, oder sie laufen im Hintergrund. Im Hintergrund laufende Prozesse dominieren das Terminalfenster nicht und Sie können darin weiterarbeiten. Oder zumindest dominieren sie das Terminalfenster nicht, wenn sie keine Bildschirmausgabe generieren.

Ein unordentliches Beispiel

Wir starten einen einfachen Ping Trace läuft. Wir werden die 1techpc.de-Domain pingen. Dies wird als Vordergrundprozess ausgeführt.

ping www.wdzwdz.com

Wir erhalten die erwarteten Ergebnisse, indem wir im Terminalfenster nach unten scrollen. Wir können im Terminalfenster nichts anderes tun, während Ping ausgeführt wird. Um den Befehl zu beenden, drücken Sie Strg+C.

Ctrl+C

Der sichtbare Effekt von Strg+C ist im Screenshot hervorgehoben. ping gibt eine kurze Zusammenfassung und stoppt dann.

Wiederholen wir das. Aber diesmal drücken wir Strg+Z statt Strg+C. Die Aufgabe wird nicht beendet. Es wird zu einer Hintergrundaufgabe. Wir bekommen die Kontrolle über das Terminalfenster zurück.

ping www.wdzwdz.com
Ctrl+Z

Der sichtbare Effekt des Drückens von Strg+Z ist im Screenshot hervorgehoben.

Diesmal wird uns mitgeteilt, dass der Prozess gestoppt wird. Gestoppt bedeutet nicht beendet. Es ist wie ein Auto an einem Stoppschild. Wir haben es nicht verschrottet und weggeworfen. Es ist immer noch auf der Straße, steht still und wartet darauf, dass es losgeht. Der Prozess ist jetzt ein Hintergrundjob.

Der Job-Befehl wird die Jobs auflisten die in der aktuellen Terminalsitzung gestartet wurden. Und weil Jobs (unvermeidlich) Prozesse sind, können wir sie auch mit dem Befehl ps anzeigen. Lassen Sie uns beide Befehle verwenden und ihre Ausgaben vergleichen. Wir verwenden die Option T (Terminal), um nur die Prozesse aufzulisten, die in diesem Terminalfenster ausgeführt werden. Beachten Sie, dass bei der Option T kein Bindestrich erforderlich ist.

jobs
ps T

Der Befehl jobs sagt uns:

  So installieren Sie Grub unter Arch Linux neu

[1]: Die Zahl in eckigen Klammern ist die Auftragsnummer. Wir können dies verwenden, um auf den Job zu verweisen, wenn wir ihn mit Jobsteuerbefehlen steuern müssen.
+: Das Pluszeichen + zeigt an, dass dies der Job ist, auf den reagiert wird, wenn wir einen Jobsteuerungsbefehl ohne eine bestimmte Jobnummer verwenden. Er wird als Standardjob bezeichnet. Der Standardjob ist immer der Job, der zuletzt der Jobliste hinzugefügt wurde.
Gestoppt: Der Prozess wird nicht ausgeführt.
ping www.wdzwdz.com: Die Befehlszeile, die den Prozess gestartet hat.

Der Befehl ps sagt uns:

PID: Die Prozess-ID des Prozesses. Jeder Prozess hat eine eindeutige ID.
TTY: Der Pseudo-Teletyp (Terminalfenster), von dem aus der Prozess ausgeführt wurde.
STAT: Der Status des Prozesses.
TIME: Die vom Prozess verbrauchte CPU-Zeit.
BEFEHL: Der Befehl, der den Prozess gestartet hat.

Dies sind allgemeine Werte für die Spalte STAT:

D: Ununterbrochener Schlaf. Der Prozess befindet sich in einem Wartezustand, wartet normalerweise auf Eingabe oder Ausgabe und kann nicht unterbrochen werden.
Ich: Leerlauf.
R: Laufen.
S: Unterbrechbarer Schlaf.
T: Gestoppt durch ein Auftragssteuersignal.
Z: Ein Zombie-Prozess. Der Prozess wurde beendet, aber nicht von seinem übergeordneten Prozess „gereinigt“.

Dem Wert in der Spalte STAT kann einer dieser zusätzlichen Indikatoren folgen:

<: high-priority="" task="" nice="" to="" other="" processes="" n:="" low-priority="" l:="" process="" has="" pages="" locked="" into="" memory="" used="" by="" real-time="" s:="" a="" session="" leader.="" leader="" is="" that="" launched="" groups.="" shell="" multi-thread="" process.="" foreground="">Wir können sehen, dass Bash einen Zustand von Ss hat. Das große „S“ sagt uns, dass die Bash-Shell schläft und unterbrechbar ist. Sobald wir es brauchen, wird es antworten. Das kleine „s“ sagt uns, dass die Shell ein Sitzungsleiter ist.

Der Ping-Befehl hat den Status T. Dies sagt uns, dass Ping durch ein Job-Steuersignal gestoppt wurde. In diesem Beispiel war das Strg+Z, mit dem wir es in den Hintergrund gestellt haben.

Der Befehl ps T hat den Status R, was für running steht. Das + zeigt an, dass dieser Prozess ein Mitglied der Vordergrundgruppe ist. Der Befehl ps T läuft also im Vordergrund.

Das bg-Kommando

Der Befehl bg wird verwendet, um einen Hintergrundprozess fortzusetzen. Es kann mit oder ohne Auftragsnummer verwendet werden. Wenn Sie ihn ohne Jobnummer verwenden, wird der Standardjob in den Vordergrund geholt. Der Vorgang läuft weiterhin im Hintergrund. Sie können ihm keine Eingaben senden.

Wenn wir den Befehl bg ausgeben, setzen wir unseren Ping-Befehl fort:

bg

Der Ping-Befehl wird fortgesetzt und wir sehen erneut die scrollende Ausgabe im Terminalfenster. Der Name des neu gestarteten Befehls wird Ihnen angezeigt. Dies ist im Screenshot hervorgehoben.

Aber wir haben ein Problem. Die Aufgabe wird im Hintergrund ausgeführt und akzeptiert keine Eingaben. Wie also stoppen wir es? Strg+C macht nichts. Wir können es sehen, wenn wir es eingeben, aber die Hintergrundaufgabe empfängt diese Tastenanschläge nicht, sodass sie weiterhin fröhlich pingt.

  Die 4 besten Microsoft Access-Alternativen für Linux-Benutzer

Tatsächlich befinden wir uns jetzt in einem seltsamen Mischmodus. Wir können im Terminalfenster etwas eingeben, aber was wir eingeben, wird schnell von der scrollenden Ausgabe des Ping-Befehls weggefegt. Alles, was wir eingeben, wird im Vordergrund wirksam.

Um unsere Hintergrundaufgabe zu stoppen, müssen wir sie in den Vordergrund bringen und dann stoppen.

Das fg-Kommando

Der Befehl fg bringt eine Hintergrundaufgabe in den Vordergrund. Genau wie der Befehl bg kann er mit oder ohne Auftragsnummer verwendet werden. Die Verwendung mit einer Auftragsnummer bedeutet, dass es für einen bestimmten Auftrag ausgeführt wird. Bei Verwendung ohne Auftragsnummer wird der letzte Befehl verwendet, der in den Hintergrund gesendet wurde.

Wenn wir fg eingeben, wird unser Ping-Befehl in den Vordergrund gebracht. Die von uns eingegebenen Zeichen werden mit der Ausgabe des Ping-Befehls verwechselt, aber von der Shell bearbeitet, als ob sie wie gewohnt in der Befehlszeile eingegeben worden wären. Und aus Sicht der Bash-Shell ist genau das passiert.

fg

Und jetzt, wo der Ping-Befehl wieder im Vordergrund läuft, können wir ihn mit Strg+C beenden.

Ctrl+C

Wir müssen die richtigen Signale senden

Das war nicht gerade schön. Offensichtlich funktioniert das Ausführen eines Prozesses im Hintergrund am besten, wenn der Prozess keine Ausgabe erzeugt und keine Eingabe erfordert.

Aber ob unordentlich oder nicht, unser Beispiel hat erreicht:

Einen Prozess in den Hintergrund stellen.
Wiederherstellen des Prozesses in einen laufenden Zustand im Hintergrund.
Den Prozess in den Vordergrund zurückbringen.
Beenden des Prozesses.

Wenn Sie Strg+C und Strg+Z verwenden, senden Sie Signale an den Prozess. Diese sind Kurze Wege den Kill-Befehl zu verwenden. Es gibt 64 verschiedene Signale dass töten kann senden. Verwenden Sie kill -l in der Befehlszeile, um sie aufzulisten. kill ist nicht die einzige Quelle dieser Signale. Einige von ihnen werden automatisch von anderen Prozessen innerhalb des Systems ausgelöst

Hier sind einige der am häufigsten verwendeten.

SIGHUP: Signal 1. Wird automatisch an einen Prozess gesendet, wenn das Terminal, in dem er läuft, geschlossen wird.
SIGINT: Signal 2. An einen Prozess gesendet, drücken Sie Strg+C. Der Prozess wird unterbrochen und zum Beenden aufgefordert.
SIGQUIT: Signal 3. Wird an einen Prozess gesendet, wenn der Benutzer ein Quit-Signal Strg+D sendet.
SIGKILL: Signal 9. Der Prozess wird sofort beendet und versucht nicht, sauber zu schließen. Der Prozess läuft nicht anmutig ab.
SIGTERM: Signal 15. Dies ist das Standardsignal, das von kill gesendet wird. Es ist das Standardsignal zum Beenden von Programmen.
SIGTSTP: Signal 20. Wird an einen Prozess gesendet, wenn Sie Strg+Z verwenden. Es stoppt den Prozess und stellt ihn in den Hintergrund.

Wir müssen den Befehl kill verwenden, um Signale auszugeben, denen keine Tastenkombinationen zugewiesen sind.

Weitere Jobkontrolle

Ein mit Strg+Z in den Hintergrund verschobener Prozess wird in den gestoppten Zustand versetzt. Wir müssen den Befehl bg verwenden, um ihn wieder zu starten. Ein Programm als laufenden Hintergrundprozess zu starten ist einfach. Fügen Sie ein kaufmännisches Und & am Ende der Befehlszeile an.

  So hosten Sie Ihr eigenes RSS-System unter Linux mit Tiny Tiny RSS

Obwohl es am besten ist, dass Hintergrundprozesse nicht in das Terminalfenster schreiben, werden wir Beispiele verwenden, die dies tun. Wir brauchen etwas in den Screenshots, auf das wir uns beziehen können. Dieser Befehl startet eine Endlosschleife als Hintergrundprozess:

während wahr; do echo „1techpc.de Loop Process“; Schlaf 3; fertig &

während wahr;  mach echo

Uns werden die Auftragsnummer und die Prozess-ID des Prozesses mitgeteilt. Unsere Auftragsnummer ist 1, und die Prozess-ID ist 1979. Wir können diese Kennungen verwenden, um den Prozess zu steuern.

Die Ausgabe unserer Endlosschleife beginnt im Terminalfenster zu erscheinen. Wie zuvor können wir die Befehlszeile verwenden, aber alle Befehle, die wir ausgeben, werden mit der Ausgabe des Schleifenprozesses vermischt.

ls

Um unseren Prozess zu stoppen, können wir Jobs verwenden, um uns an die Jobnummer zu erinnern, und dann kill verwenden.

jobs meldet, dass unser Prozess die Jobnummer 1 ist. Um diese Nummer mit kill zu verwenden, müssen wir ihr ein Prozentzeichen % voranstellen.

jobs
kill %1

kill sendet das SIGTERM-Signal, Signalnummer 15, an den Prozess und dieser wird beendet. Beim nächsten Drücken der Eingabetaste wird ein Status des Jobs angezeigt. Es listet den Prozess als „beendet“ auf. Wenn der Prozess nicht auf den Kill-Befehl reagiert, können Sie ihn noch einmal verbessern. Verwenden Sie kill mit SIGKILL , Signal Nummer 9. Setzen Sie einfach die Nummer 9 zwischen den Kill-Befehl und die Jobnummer.

kill 9 %1

Dinge, die wir behandelt haben

Strg+C: Sendet SIGINT, Signal 2, an den Prozess – wenn er Eingaben akzeptiert – und weist ihn an, zu beenden.
Strg+D: Sendet SISQUIT, Signal 3, an den Prozess – wenn er Eingaben akzeptiert – und weist ihn an, ihn zu beenden.
Strg+Z: Sendet SIGSTP, Signal 20, an den Prozess und teilt ihm mit, dass er anhalten (suspendieren) und ein Hintergrundprozess werden soll.
Jobs: Listet die Hintergrundjobs auf und zeigt ihre Jobnummer an.
bg job_number: Startet einen Hintergrundprozess neu. Wenn Sie keine Jobnummer angeben, wird der letzte Prozess verwendet, der in eine Hintergrundaufgabe umgewandelt wurde.
fg job_number: bringt einen Hintergrundprozess in den Vordergrund und startet ihn neu. Wenn Sie keine Jobnummer angeben, wird der letzte Prozess verwendet, der in eine Hintergrundaufgabe umgewandelt wurde.
Befehlszeile &: Das Hinzufügen eines kaufmännischen Und-Zeichens & am Ende einer Befehlszeile führt diesen Befehl als Hintergrundaufgabe aus, die ausgeführt wird.
kill %job_number: Sendet SIGTERM, Signal 15, an den Prozess, um ihn zu beenden.
kill 9 %job_number: Sendet SIGKILL, Signal 9, an den Prozess und beendet ihn abrupt.