Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Ausführliche Erläuterung von drei Methoden, um Prozesse unter Linux im Hintergrund laufen zu lassen

Ausführliche Erläuterung von drei Methoden, um Prozesse unter Linux im Hintergrund laufen zu lassen

黄舟
黄舟Original
2017-06-07 10:32:394463Durchsuche

Dieses Problem tritt häufig auf. Wir möchten einige Langzeitaufgaben auf dem Linux-Server ausführen, aber die Aufgabe schlägt mitten in der Netzwerkinstabilität fehl. Wie kann verhindert werden, dass der Befehl gestört wird, indem das Terminalfenster lokal geschlossen/die Netzwerkverbindung getrennt wird, nachdem der Befehl übermittelt wurde?

Die folgenden drei Methoden können die oben genannten Anforderungen problemlos erfüllen.

Problemanalyse:

Wir wissen, dass das Terminal das HUP-Signal (Auflegen) empfängt und alle seine untergeordneten Prozesse schließt, wenn sich der Benutzer abmeldet (abmelden) oder die Netzwerkverbindung getrennt wird. Daher gibt es bei unserer Lösung zwei Möglichkeiten: Entweder lässt man den Prozess das HUP-Signal ignorieren oder man lässt den Prozess in einer neuen Sitzung laufen und wird zu einem untergeordneten Prozess, der nicht zu diesem Terminal gehört.

Drei Lösungen:

1. nohup

nohup ist zweifellos die erste Lösung, die uns einfällt. Wie der Name schon sagt, besteht der Zweck von Nohup darin, den übermittelten Befehl dazu zu bringen, das Auflegesignal zu ignorieren.

Nohup ist sehr bequem zu verwenden. Fügen Sie einfach nohup hinzu, bevor der zu verarbeitende Befehl standardmäßig in die Datei nohup.out umgeleitet wird. Im Allgemeinen können wir am Ende „&“ hinzufügen, um den Befehl gleichzeitig im Hintergrund auszuführen, oder wir können „>DateiName 2>&1“ verwenden, um den Standardnamen der Umleitungsdatei zu ändern.

Nohup-Beispiel

[root@pythontab ~]# nohup ping www.pythontab.com &
[1] 3059
nohup: appending output to `nohup.out'
[root@pythontab ~]# ps -ef |grep 3059
root      3059   984  0 15:06 pts/3    00:00:00 ping www.pythontab.com
root      3067   984  0 15:06 pts/3    00:00:00 grep 3059
[root@pythontab ~]#

2. setsid

nohup kann zweifellos verhindern, dass unser Prozess auf halbem Weg unterbrochen wird, indem es das HUP-Signal ignoriert, aber wenn wir es aus einem anderen Blickwinkel betrachten, wenn unser Prozess nicht zum Terminal gehört Wenn der untergeordnete Prozess das HUP-Signal akzeptiert, wird er natürlich nicht vom HUP-Signal beeinflusst. Setsid hilft uns dabei.

Die Verwendung von „setsid“ ist ebenfalls sehr praktisch. Sie müssen nur „setsid“ hinzufügen, bevor der Befehl verarbeitet wird.

setsid-Beispiel

[root@pythontab ~]# setsid ping www.pythontab.com
[root@pythontab ~]# ps -ef |grep www.pythontab.com
root     31094     1  0 07:28 ?        00:00:00 ping www.pythontab.com
root     31102 29217  0 07:29 pts/4    00:00:00 grep www.pythontab.com
[root@pythontab ~]#

Es ist erwähnenswert, dass im obigen Beispiel unsere Prozess-ID (PID) 31094 ist, und seine übergeordnete ID (PPID) 1 ist (d. h die Init-Prozess-ID), nicht die Prozess-ID des aktuellen Terminals.

3. & Subshell

Hier ist ein weiterer kleiner Trick zu Subshell. Wir wissen, dass das Einfügen eines oder mehrerer Namen in „()“ die Ausführung dieser Befehle in einer Subshell ermöglicht und so viele interessante Funktionen erweitert, von denen wir jetzt eine besprechen werden.

Wenn wir „&“ in „()“ einfügen, werden wir feststellen, dass der übermittelte Job nicht in der Jobliste enthalten ist, das heißt, er kann die Jobs nicht bestehen. Kam zur Überprüfung es raus. Werfen wir einen Blick darauf, warum dies funktioniert, um das HUP-Signal zu vermeiden.

Subshell-Beispiel

[root@pythontab ~]# (ping www.pythontab.com &)
[root@pythontab ~]# ps -ef |grep www.pythontab.com
root     16270     1  0 16:13 pts/4    00:00:00 ping www.pythontab.com
root     16278 15362  0 16:13 pts/4    00:00:00 grep www.pythontab.com
[root@pythontab ~]#

Wie aus dem obigen Beispiel ersichtlich ist, ist die übergeordnete ID (PPID) des neu übermittelten Prozesses 1 (die PID des Init-Prozesses). nicht der Prozess der aktuellen Terminal-ID. Daher gehört er nicht zum untergeordneten Prozess des aktuellen Terminals und wird daher nicht vom HUP-Signal des aktuellen Terminals beeinflusst.

Vergleichsweise bevorzuge ich die Verwendung von setsid, was einfach und praktisch ist. Natürlich hängt es hier von den Vorlieben jedes Einzelnen ab und es gibt keinen großen Unterschied in der Wirkung.

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung von drei Methoden, um Prozesse unter Linux im Hintergrund laufen zu lassen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn