Eine Erklärung, wie man das System unter Linux im Hintergrund laufen lässt

巴扎黑
Freigeben: 2017-08-22 13:53:59
Original
1336 Leute haben es durchsucht

Dieses Problem tritt häufig auf. Wir möchten einige Langzeitaufgaben auf dem Linux-Server ausführen, aber die Aufgabe schlägt aufgrund von 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?

Im Folgenden sind drei Methoden aufgeführt, mit denen die oben genannten Anforderungen problemlos erfüllt werden können.

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.php.cn &
[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.php.cn
root      3067   984  0 15:06 pts/3    00:00:00 grep 3059
[root@pythontab ~]#
Nach dem Login kopieren

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 untergeordneten Prozess des Terminals gehört, das das HUP akzeptiert Signal, dann wird es natürlich nicht mehr vom HUP-Signal beeinflusst. Setsid hilft uns dabei.

Die Verwendung von „setsid“ ist ebenfalls sehr praktisch. Sie müssen „setsid“ nur vor dem zu verarbeitenden Befehl hinzufügen.

setsid-Beispiel

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

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 noch ein kleiner Tipp 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 ist, d. h. er kann nicht über Jobs angezeigt werden. Werfen wir einen Blick darauf, warum dies funktioniert, um das HUP-Signal zu vermeiden.

Subshell-Beispiel

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

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.

Im Vergleich 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 vonEine Erklärung, wie man das System unter Linux im Hintergrund laufen lässt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!