Trennen des Prozesses vom übergeordneten Element unter Linux
Jedes Programm, das Sie von Ihrer funktionierenden Shell aus ausführen, wird für das Linux-System als Prozess betrachtet. Jeder Prozess, mit Ausnahme von init, hat seinen übergeordneten Prozess, der durch PPID (ID des übergeordneten Prozesses) identifiziert wird. Wenn Sie einen Prozess mit der aktuellen Shell starten, wird die Shell selbst zum übergeordneten Element für den neu gestarteten Prozess. Das Problem bei diesem Ansatz ist, dass dies nicht immer wünschenswert ist, da beim Beenden des übergeordneten Prozesses sein untergeordneter Prozess mit ihm stirbt.
Dies bedeutet, dass das Schließen der aktuellen Shell die darin enthaltenen untergeordneten Prozesse beendet. Dies ist in einigen Situationen nicht ideal, da Sie das Terminal oder die SSH-Sitzung am Leben erhalten müssen, um die darin ausgeführten untergeordneten Prozesse nicht zu stoppen. Nachdem Sie sich von Ihrem Terminal abgemeldet haben, wird die übergeordnete Shell beendet und damit alle Prozesse, die von ihr abgezweigt wurden. In diesem Tutorial werden wir einige Methoden untersuchen, um einen Prozess von seinem übergeordneten Prozess unter Linux zu trennen.
In diesem Tutorial lernen Sie:
- So trennen Sie den untergeordneten Prozess mit den Standardbefehlen
disownundnohup - So stellen Sie einen Prozess in den Hintergrund und rufen ihn in den Vordergrund
- So trennen Sie den untergeordneten Prozess mit den installierbaren
Befehlen atundscreen
Trennen Sie den Prozess, indem Sie ihn in den Hintergrund stellen
Wenn Sie einen Befehl ausführen, der lange Zeit ausgeführt werden soll, besteht das Problem darin, dass Ihr aktuelles Terminal für den Befehl dediziert wird. Sie können das Terminal nicht weiter verwenden und es auch nicht schließen, da dadurch der Befehl beendet wird, der gerade ausgeführt wird.
Wenn Sie einen Befehl ausführen und ihn in den Hintergrund stellen müssen, um Ihr Terminal freizugeben, können Sie Strg + Z auf Ihrer Tastatur drücken, um den Vorgang zu stoppen. Hier ist ein Beispiel.
sleep 10000
^Z
[1]+ Stopped sleep 10000
Um eine Liste der Aufträge im Hintergrund anzuzeigen, verwenden Sie den Befehl jobs.
jobs -l
[1]+ 1650 Stopped sleep 10000
Um einen Job wieder in den Vordergrund zu bringen, können wir den Befehl fg verwenden.
fg
Wenn wir mehrere gestoppte Aufträge hätten, müssten wir ein Prozentzeichen verwenden und die Auftrags-ID angeben, um den entsprechenden Auftrag wieder in den Vordergrund zu bringen.
fg %1
Super, jetzt können wir Prozesse in den Hintergrund stellen und sie später wieder zurückholen, wenn wir sie wollen. Aber was ist, wenn wir möchten, dass der Befehl weiterhin ausgeführt wird, während er sich im Hintergrund befindet? Dazu können wir den Befehl bg verwenden, gefolgt von einem kaufmännischen Und-Zeichen und der Job-ID. Mit dem folgenden Befehl wird der gestoppte Job fortgesetzt, während er im Hintergrund bleibt.
bg %1
[1]+ sleep 10000 &
Jetzt können wir sehen, dass der Prozess noch im Hintergrund läuft, aber den Status "läuft" anstelle von "gestoppt" anzeigt. ”
jobs -l
[1]+ 1650 Running sleep 10000 &
Eines gibt es noch zu beachten. Sie können Ihr aktuelles Terminal nicht schließen, oder diese Hintergrundaufträge werden geschlossen. Wenn Sie Ihr Terminal schließen müssen und nicht möchten, dass diese Befehle gestoppt werden, müssen Sie die Aufgaben "ablehnen". Wenn Sie nur einen Job im Hintergrund haben, funktioniert der folgende Befehl:
disown
Wenn Sie über mehrere verfügen, müssen Sie die Auftrags-ID angeben.
disown %1
Der Auftrag wird nicht mehr in der Auftragstabelle angezeigt, wenn Sie den Befehl aufträge ausführen. Jetzt ist es sicher, das Terminal zu schließen, und Ihr Befehl wird weiter ausgeführt.
jobs -l
Sie können Ihren ausgeführten Befehl weiterhin im Auge behalten, indem Sie den Befehl ps verwenden.
ps aux | grep sleep
linuxco+ 1650 0.0 0.0 8084 524 pts/0 S 12:27 0:00 sleep 10000
Und wenn Sie die Ausführung des Befehls stoppen möchten, können Sie den Befehl kill verwenden und die Prozess-ID angeben.
kill 1650
Nun haben wir gesehen, wie man einen laufenden Prozess in den Hintergrund stellt und später wieder aufruft. Wir haben aber auch die Möglichkeit, den Befehl zu Beginn einfach im Hintergrund zu starten. Alles, was Sie tun müssen, ist, ein kaufmännisches Und-Zeichen an das Ende eines Linux-Befehls zu setzen.
sleep 10000 &
[1] 1900
Genau wie zuvor können wir sehen, dass der Job mit dem Befehl jobs aufgelistet ist. Dieses Mal läuft der Job jedoch bereits und wir mussten ihn nicht manuell im Hintergrund starten.
jobs -l
[1]+ 1900 Running sleep 10000 &
Prozess trennen und am Laufen halten mit nohup
Wir haben bereits in einem früheren Beispiel gesehen, wie wir den Befehl disown verwenden können, um sicherzustellen, dass der Befehl auch nach dem Schließen unseres Terminals weiter ausgeführt wird. Eine weitere Option ist der Befehl nohup.
nohup weist einen Prozess an, alle empfangenen SIGHUP-Signale (Auflegen) zu ignorieren. Das SIGHUP-Signal wird immer dann an einen Hintergrundjob gesendet, wenn das aktuelle Terminal geschlossen wird. So können wir einen Job im Hintergrund haben, das Terminal schließen und ihn trotzdem im Hintergrund laufen sehen. Hier ist ein Beispiel.
nohup sleep 10000 &
[1] 1908
nohup: ignoring input and appending output to 'nohup.out'
Wir haben das Terminal geschlossen und erneut geöffnet, dann haben wir den folgenden Befehl ausgeführt, der anzeigt, dass der Befehl noch ausgeführt wird.
ps aux | grep sleep
linuxco+ 1908 0.0 0.0 8084 524 ? S 13:05 0:00 sleep 10000
Verwenden des Bildschirmbefehls
Bisher haben wir die standardmäßigen Linux-Methoden zum Ausführen von Befehlen im Hintergrund behandelt. Es gibt jedoch auch zusätzliche Softwarepakete, die verwendet werden können. Der vielleicht beliebteste ist der Bildschirmbefehl. Unter diesem Link finden Sie Installationsanweisungen und detaillierte Gebrauchsanweisungen.
Anstatt einen untergeordneten Prozess an Ihr aktuelles Terminal anzuhängen, können wir ihn stattdessen an einen anderen Prozess anhängen. Das Anhängen eines Prozesses an eine "Bildschirm"-Sitzung ermöglicht es uns, ihn von unserem aktuellen Terminal zu lösen, wodurch wir uns von der SSH-Sitzung abmelden oder das Terminal vollständig schließen können, ohne den laufenden Prozess zu stoppen.
So funktioniert es:
Führen Sie den
Befehl screenaus, um einen neuen "screen" zu starten. Fügen Sie optional die Option-Sein, um ihm einen Namen zu geben.screen -S mycommandFühren Sie in der neuen Bildschirmsitzung (die bei der Erstellung automatisch angehängt wird) den Befehl oder das Skript aus, das Sie in den Hintergrund stellen möchten.
/path/to/myscript.sh-
Drücken Sie
STRG+Aauf der Tastatur und dannD. Dadurch wird der Bildschirm getrennt, dann können Sie das Terminal schließen, sich von Ihrer SSH-Sitzung abmelden usw. und der Bildschirm bleibt erhalten. Verwenden Sie diesen Befehl, um eine Liste der Bildschirme anzuzeigen.screen -ls There is a screen on: 2741.mycommand (05/11/2022 01:13:24 PM) (Detached) 1 Socket in /run/screen/S-linuxconfig. Um das Anhängen an einen Bildschirm wiederherzustellen, verwenden Sie den folgenden Befehl, und ersetzen Sie die untenstehende Zahl durch die eigene Prozess-ID.
screen -r 2741
Prozess mit at-Befehl trennen
Perhabs Eine noch einfachere Möglichkeit, Ihren Prozess von der aktuellen Arbeitsshell zu lösen, ist die Verwendung des Befehls at (siehe den verlinkten Artikel für Installationsanweisungen).
Das folgende Beispiel veranschaulicht, wie Sie den Auftrag, in diesem Fall den Befehl yes, ausführen und dann diesen Prozess von der aktuellen Arbeitsshell trennen.
at now
at> yes > /dev/null
at>
job 2 at Thu May 09 11:12:00 2022
In der ersten Zeile haben wir jetzt den Befehl at mit dem Argument time gestartet. Als nächstes geben wir den Befehl ein, den wir ausführen möchten. Zum Schluss senden wir durch Drücken der Tastenkombination STRG + D das EOT-Signal ( End Of Text ), dass wir mit der Ausgabe von Befehlen fertig sind und der Job sofort beginnt. Das Auflisten aktueller Jobs mit dem Befehl jobs erzeugt keine Ausgabe, was bedeutet, dass wir frei sind, uns von unserer aktuellen Shell zu lösen, ohne Prozesse zu stoppen.
Abschließende Gedanken
In diesem Tutorial haben wir gesehen, wie man einen Prozess von seinem übergeordneten Prozess auf einem Linux-System trennt. Die Hauptmotivation für das Trennen eines untergeordneten Prozesses besteht darin, das Terminal freizugeben, damit es geschlossen werden kann oder der Benutzer sich von seiner SSH- oder Telnet-Sitzung abmelden kann. Es gibt zahlreiche Möglichkeiten, einen Prozess unter Linux zu lösen, wobei screen und wahrscheinlich am einfachsten sind, aber nicht standardmäßig verfügbar sind. Wenn Sie keine zusätzliche Software installieren möchten, funktioniert das Verleugnen und Starten von Aufträgen im Hintergrund gut.
