Anleitung zur Ausführung und Steuerung von Hintergrund-Prozessen unter Linux

  • Dave McKay

    @TheGurkha

  • September 24, 2019, 8:00 Uhr EDT
Fatmawati Achmad Zaenuri/.com

Verwenden Sie die Bash-shell unter Linux zu verwalten Vordergrund-und Hintergrundprozesse. Sie können die Jobsteuerfunktionen 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

Wenn ein Programm in einem Linux-oder Unix-ähnlichen Betriebssystem ausgeführt wird, wird ein Prozess gestartet., „Prozess“ ist der Name für die interne Darstellung des ausführenden Programms im Speicher des Computers. Es gibt einen Prozess für jedes aktive Programm. Tatsächlich gibt es einen Prozess für fast alles, was auf Ihrem Computer ausgeführt wird. Dazu gehören die Komponenten Ihrer grafischen Desktop-Umgebung (GDE) wie GNOME oder KDE sowie System-Daemons, die beim Start gestartet werden.

Warum fast alles, was läuft? Nun, Bash-Built-Ins wie cd, pwd und Alias müssen keinen Prozess starten (oder „erzeugen“), 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 schnell, gerade weil sie keinen Prozess starten müssen, damit sie ausgeführt werden können. (Sie können help in ein Terminalfenster eingeben, um die Liste der eingebauten Bash-Ins anzuzeigen.)

<

Prozesse können im Vordergrund ausgeführt werden, in diesem Fall übernehmen sie Ihr Terminal, bis sie abgeschlossen sind, oder sie können im Hintergrund ausgeführt werden., Prozesse, die im Hintergrund ausgeführt werden, dominieren das Terminalfenster nicht und Sie können weiterhin darin arbeiten. Oder zumindest dominieren sie das Terminalfenster nicht, wenn sie keine Bildschirmausgabe generieren.

Ein unordentliches Beispiel

Wir starten einen einfachenping Trace. Wir gehen zu ping die How-To Geek domain. Dies wird als Vordergrundprozess ausgeführt.

ping www.howtogeek.com

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

Ctrl+C

Der sichtbare Effekt der Ctrl+C ist im Screenshot hervorgehoben. ping gibt eine kurze Zusammenfassung und dann Stoppt.

Werbung

Wiederholen wir das. Aber dieses Mal treffen wir Ctrl+Z anstelle von Ctrl+C. Die Aufgabe wird nicht beendet. Es wird eine Hintergrundaufgabe. Wir bekommen die Kontrolle über das Terminalfenster zurück zu uns.,

ping www.howtogeek.com
Ctrl+Z

Der sichtbare Effekt des Treffens von Ctrl+Z wird im Screenshot hervorgehoben.

Dieses Mal wird uns gesagt, 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, stationär, wartet zu gehen. Der Prozess ist jetzt ein Hintergrundjob.

Der Befehl jobs listet die Jobs auf, die in der aktuellen Terminalsitzung gestartet wurden., Und da Jobs (zwangsläufig) Prozesse sind, können wir sie auch mit dem Befehl ps. Lassen Sie uns beide Befehle verwenden und ihre Ausgaben vergleichen. Wir verwenden die Option T option (terminal), um nur die Prozesse aufzulisten, die in diesem Terminalfenster ausgeführt werden. Beachten Sie, dass Sie keinen Bindestrich - mit der Option T verwenden müssen.

jobs
ps T

Der Befehl jobs sagt uns:

  • : Die Zahl in eckigen Klammern ist die Auftragsnummer., Wir können dies verwenden, um auf den Job zu verweisen, wenn wir ihn mit Jobsteuerungsbefehlen steuern müssen.
  • +: Das Pluszeichen + zeigt, dass dies der Job ist, auf den reagiert wird, wenn wir einen Jobsteuerungsbefehl ohne eine bestimmte Jobnummer verwenden. Es wird als Standardjob bezeichnet. Der Standardauftrag ist immer derjenige, der zuletzt zur Liste der Aufträge hinzugefügt wurde.
  • Gestoppt: Der Prozess wird nicht ausgeführt.
  • ping www.howtogeek.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), aus dem der Prozess ausgeführt wurde.
  • STAT: Der Status des Prozesses.
  • ZEIT: Die vom Prozess verbrauchte CPU-Zeit.
  • BEFEHL: Der Befehl, der den Prozess gestartet hat.

Dies sind allgemeine Werte für die Spalte STAT:

  • D: Unterbrechungsfreier Schlaf. Der Prozess befindet sich in einem Wartezustand, wartet normalerweise auf Eingabe oder Ausgabe und kann nicht unterbrochen werden.,
  • ich: „Inaktiv“.
  • R: Laufen.
  • S: Unterbrechbarer Schlaf.
  • T: Durch ein Jobsteuersignal gestoppt.
  • Z: Ein Zombie-Prozess. Der Prozess wurde beendet, aber nicht von seinem übergeordneten Prozess „bereinigt“.
<

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

  • <: Aufgabe mit hoher Priorität (nicht für andere Prozesse geeignet).
  • N: Niedrige Priorität (nett zu anderen Prozessen).
  • L: Der Prozess hat Seiten im Speicher gesperrt (normalerweise von Echtzeitprozessen verwendet).,
  • s: Ein Sitzungsleiter. Ein Sitzungsleiter ist ein Prozess, der Prozessgruppen gestartet hat. Eine Shell ist ein Sitzungsleiter.
  • l: Multi-thread-Prozess.
  • +: Ein vordergrundprozess.

Wir können sehen, dass Bash den Status Sshat. Die Großbuchstaben“ S “ sagen uns, dass die Bash-Shell schläft und unterbrechbar ist. Sobald wir es brauchen, wird es antworten. Das Kleinbuchstaben “ s “ sagt uns, dass die Shell ein Sitzungsleiter ist.

Der Ping-Befehl hat den Status T., Dies sagt uns, dass ping durch ein Jobsteuersignal gestoppt wurde. In diesem Beispiel war das die Ctrl+Z Wir haben es in den Hintergrund gestellt.

Der Befehl ps T hat den Status R, der für running steht. Die + gibt an, dass dieser Prozess Mitglied der Vordergrundgruppe ist. Der Befehl ps T wird also im Vordergrund ausgeführt.

Der Befehl bg

Der Befehl bg wird verwendet, um einen Hintergrundprozess fortzusetzen., Es kann mit oder ohne Jobnummer verwendet werden. Wenn Sie es ohne Jobnummer verwenden, wird der Standardauftrag in den Vordergrund gestellt. Der Prozess läuft noch im Hintergrund. Sie können keine Eingaben senden.

>

Wenn wir den Befehl bg ausgeben, setzen wir unseren Befehl ping fort:

Der Befehl ping wird fortgesetzt und die Bildlaufausgabe im Terminalfenster wird erneut angezeigt. Der Name des neu gestarteten Befehls wird für Sie angezeigt., Dies wird im Screenshot hervorgehoben.

Aber wir haben ein problem. Die Aufgabe wird im Hintergrund ausgeführt und akzeptiert keine Eingaben. Also, wie stoppen wir es? Ctrl+C tut nichts. Wir können es sehen, wenn wir es eingeben, aber die Hintergrundaufgabe empfängt diese Tastenanschläge nicht, sodass es weiterhin fröhlich wegpingt.

Werbung

Tatsächlich befinden wir uns jetzt in einem seltsamen Mischmodus. Wir können das Terminalfenster eingeben, aber was wir eingeben, wird durch die Bildlaufausgabe des Befehls ping schnell weggefegt. Alles, was wir eingeben, wird im Vorstehenden wirksam.,

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

Der Befehl fg

Der Befehl fg bringt eine Hintergrundaufgabe in den Vordergrund. Genau wie der Befehl bg kann er mit oder ohne Jobnummer verwendet werden. Wenn Sie es mit einer Jobnummer verwenden, wird es für einen bestimmten Job verwendet. Wenn es ohne Jobnummer verwendet wird, wird der letzte Befehl verwendet, der an den Hintergrund gesendet wurde.

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

fg

Und jetzt, da wir den Befehl pingim Vordergrund haben, können wir ihn erneut verwenden Ctrl+C um ihn zu beenden.

Ctrl+C

Wir Müssen die Richtigen Signale Senden

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

Aber chaotisch oder nicht, unser Beispiel hat Folgendes erreicht:

  • Einen Prozess in den Hintergrund stellen.
  • Wiederherstellen des Prozesses in einen laufenden Zustand im Hintergrund.
  • Rückgabe des Prozesses in den Vordergrund.
  • Beenden des Prozesses.

Wenn Sie Ctrl+C und Ctrl+Z verwenden , senden Sie Signale an den Prozess. Dies sind Kurzmethoden zur Verwendung des Befehls kill., Es gibt 64 verschiedene Signale, die kill senden kann. 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 häufig verwendeten.

  • SEUFZER: Signal 1. Automatisch an einen Prozess gesendet, wenn das Terminal, in dem es ausgeführt wird, geschlossen wird.
  • SIGINT: Signals 2. An einen Prozess gesendet, drücken Sie Ctrl+C. Der Prozess wird unterbrochen und zum Beenden aufgefordert.,
  • SIGQUIT: Signal 3. An einen Prozess gesendet, wenn der Benutzer ein Quit-Signal sendet Ctrl+D.
  • SIGKILL: Signal 9. Der Prozess wird sofort beendet und wird nicht versuchen, sauber zu schließen. Der Prozess geht nicht anmutig unter.
  • SIGTERM: Signal 15. Dies ist das Standardsignal, das von killgesendet wird. Es ist das Standardprogrammabschlusssignal.
  • SIGTSTP: Signal 20. An einen Prozess gesendet, wenn Sie Ctrl+Z. 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 Jobsteuerung

Ein Prozess, der mit Ctrl+Z in den Hintergrund gerückt ist, wird in den Stoppzustand versetzt. Wir müssen den Befehl bg verwenden, um ihn erneut auszuführen. So starten Sie ein Programm als laufenden Hintergrundprozess ist einfach. Hängen Sie ein kaufmännisches und & an das Ende der Befehlszeile an.,

Werbung

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

while true; do echo „How-To Geek Loop Process“; sleep 3; done &

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

<

Die Ausgabe unserer Endlosschleife beginnt im Terminalfenster zu erscheinen. Nach wie vor können wir die Befehlszeile verwenden, aber alle Befehle, die wir ausgeben, sind mit der Ausgabe aus dem Schleifenprozess durchsetzt.

ls

Um unseren Prozess zu stoppen, können wir jobs, um uns daran zu erinnern, was die Auftragsnummer ist, und dann kill.

jobs meldet, dass unser Prozess Job Nummer 1 ist. Um diese Zahl 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 es wird beendet. Wenn die Eingabetaste das nächste Mal gedrückt wird, wird ein Status des Jobs angezeigt. Es listet den Prozess als “ beendet.“Wenn der Prozess nicht auf den Befehl kill reagiert, können Sie ihn eine Stufe höher ausführen. Verwenden Sie mit , Signalnummer 9. Setzen Sie einfach die Nummer 9 zwischen dem Befehl kill und der 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, ihn 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 weist ihn an, ihn zu stoppen (auszusetzen) und zu einem Hintergrundprozess zu werden.
  • jobs: Listet die Hintergrundjobs auf und zeigt deren 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 Jobnummer: holt 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.
  • commandline &: Das Hinzufügen eines kaufmännischen und & 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 %Jobnummer: Sendet SIGKILL -, signal-9, um den Prozess und beendet es abrupt.

RELATED: How to Kill Processes From the Linux Terminal

Dave McKay
Dave McKay benutzte zuerst Computer, als gestanztes Papierband in Mode war, und er programmiert seitdem. Nach über 30 Jahren in der IT-Branche ist er nun Vollzeit-Technologiejournalist., Während seiner Karriere arbeitete er als freier Programmierer, Manager eines internationalen Softwareentwicklungsteams, IT-Projektmanager und zuletzt als Datenschutzbeauftragter. Dave ist ein Linux-evangelist-und open-source-Verfechter.Lesen Sie vollständige Bio “

Leave a Comment