So verwenden Sie den nohup-Befehl unter Linux
Der Linux-Befehl nohup
lässt wichtige Prozesse weiterlaufen, selbst wenn das Terminalfenster, das sie gestartet hat, geschlossen ist. Wir zeigen Ihnen, wie Sie diesen ehrwürdigen Befehl unter modernem Linux verwenden.
HUP und SIGHUP
Unix, der Vorfahre von Linux, wurde vor der Erfindung des PCs geschaffen. Computer waren große und teure Geräte. Die Benutzer interagierten mit ihnen über serielle Leitungen, entweder lokal innerhalb desselben Gebäudes oder aus der Ferne über langsame Modemverbindungen. Anfangs druckten sie ihre Anweisungen auf Fernschreibern, die nach und nach durch stumpfe Terminals ersetzt wurden.
Sie wurden dumm genannt, weil die Rechenleistung in dem Computer lag, mit dem Sie verbunden waren, und nicht in dem Terminal, auf dem Sie tippten. Programme liefen auf dem Computer – wo auch immer er war – nicht auf dem Gerät auf Ihrem Schreibtisch.
Wenn etwas passiert ist, das die Verbindung zwischen Ihrem Terminal und dem Computer unterbrochen hat, hat der Computer einen Leitungsbruch erkannt und HUP
ein Signal an die von Ihnen ausgeführten Programme gesendet oder aufgelegt. Programme stoppten die Ausführung, wenn sie ein Signal erhielten.
Diese Funktionalität lebt heute in Linux weiter. Das Terminalfenster auf Ihrem PC ist eine Emulation eines physischen Terminals. Wenn Sie Prozesse ausführen, die von diesem Terminalfenster aus gestartet wurden, und Sie dieses Fenster schließen, wird ein SIGHUP
Signal an die Programme gesendet, damit sie informiert werden HUP
und wissen, dass sie sich beenden sollen.
Es gibt einen Kaskadeneffekt. Wenn die Prozesse untergeordnete Prozesse gestartet haben, wird SIGHUP auch an sie weitergegeben, damit sie wissen, dass sie beenden sollten.
Der Befehl nohup
startet untergeordnete Prozesse, weigert sich jedoch, SIGHUP
sie zu signalisieren. Dies mag wie ein Problem erscheinen, ist aber tatsächlich eine nützliche Funktion.
noup-Befehl
Wenn Sie möchten, dass ein Prozess fortgesetzt wird, auch wenn das Terminalfenster, von dem er gestartet wurde, geschlossen ist, müssen Sie ihn abfangen, SIGHUP
damit das Programm ihn nie erhält. (Das Terminalfenster startet eigentlich keine Prozesse, sie werden von einer Shell-Sitzung innerhalb des Terminalfensters gestartet.) Eine einfache und elegante Lösung für dieses Problem besteht darin, einen anderen Prozess zwischen die Shell-Sitzung und das Programm zu stellen und das Middleware-Programm zu haben nie SIGHUP
signalisieren.
Das nohup
tut es. Es führt Programme aus, damit Sie untergeordnete Prozesse nohup
sind, keine untergeordneten Shell-Prozesse. Da sie keine untergeordneten Prozesse der Shell sind, empfangen sie nicht direkt SIGHUP
von der Shell. Und wenn nohup
er es nicht SIGHUP
an seine Kinder weitergibt, dann wird das Programm es überhaupt nicht erhalten SIGHUP
.
Dies ist beispielsweise nützlich, wenn Sie einen langwierigen Prozess haben, der vor dem Abschluss ausgeführt werden muss. Wenn Sie versehentlich das Terminalfenster und seine Shell schließen, beenden Sie auch den Vorgang. Die Verwendung nohup
zum Starten eines Prozesses isoliert den Prozess vom nohup
Signal. Wenn Sie per SSH remote auf einem Computer arbeiten und nicht möchten, dass ein wichtiger Prozess beendet wird, wenn die Remote-Verbindung fehlschlägt, sollten Sie den Prozess auf dem Remote-Computer mit der Erweiterung starten nohup
.
Mit nohup
Wir haben ein Programm erstellt, das nichts Nützliches tut, aber es läuft und läuft, bis es fertig ist. Es gibt alle drei Sekunden die Uhrzeit im Terminalfenster aus. Dies wird als long-proc
„langer Prozess“ bezeichnet.
./long-proc
Wenn es ein Programm wäre, das etwas Nützliches tut und wir möchten, dass es auch dann weiterläuft, wenn das Terminalfenster und die Shell geschlossen sind, würden wir es mit einer nohup
.
nohup. /long-proc
Der Prozess ist davon getrennt stdin
, stdout
kann also weder Daten empfangen noch in das Terminalfenster schreiben. Da es noch ausgeführt wird, kehren Sie auch nicht zur Eingabeaufforderung zurück. Alles, nohup
was getan werden muss, ist, den Prozess gegen das Schließen des Terminals immun zu machen. Es verwandelt den Prozess nicht in eine Hintergrundaufgabe.
Müssen Sie jetzt neu starten, um den Vorgang abzuschließen? Nein. Um einen Prozess zu stoppen nohup
, den Sie nicht als Hintergrundprozess gestartet haben, drücken Sie die Tastenkombination Strg+C.
Die Ausgabe des Programms wurde für uns in eine Datei namens „nohup.out“ geschrieben. Wir können es zu einem geringeren Preis ansehen.
less nohup.out
Alles, was normalerweise an ein Terminalfenster gesendet wird, wird in einer Datei erfasst. Nachfolgende nohup
Läufe werden an die vorhandene Datei „nohup.out“ angehängt.
Ein nützlicherer Weg, einen Prozess zu starten, besteht darin, ihn so zu starten nohup
, dass er dem Schließen des Terminalfensters standhält, und ihn gleichzeitig zu einer Hintergrundaufgabe zu machen. Dazu fügen wir &
am Ende der Befehlszeile ein kaufmännisches Und „ “ hinzu.
nohup. /long-proc &
Sie müssen erneut „Enter“ drücken, um zur Befehlszeile zurückzukehren. Uns wird gesagt, dass die Prozessauftragsnummer 1 ist (die Zahl in Klammern „ []
“) und dass die Prozess-ID 13115 ist.
Wir können jeden von ihnen verwenden, um den Vorgang abzuschließen. „Strg+C“ funktioniert jetzt nicht, da das Programm weder zum Terminalfenster noch zur Shell eine Verbindung hat.
Wenn Sie die Jobnummer vergessen haben, können Sie jobs
den Befehl verwenden, um die Hintergrundaufgaben aufzulisten, die von diesem Terminalfenster aus ausgeführt werden.
jobs
Um unsere Aufgabe zu beenden, können wir kill
den Befehl und die Aufgabennummer mit vorangestelltem Prozentzeichen „ %
“ verwenden, etwa so:
kill %1
Wenn Sie das Terminalfenster geschlossen haben, müssen Sie die Prozess-ID finden und mit kill
dem Befehl verwenden. Der Befehl pgrep
findet die Prozess-ID für Prozesse, die mit dem eingegebenen Suchschlüssel übereinstimmen. Wir werden nach dem Prozessnamen suchen.
pgrep long-proc
Jetzt können wir die Prozess-ID verwenden, um den Prozess zu beenden.
kill 13115
Wenn Sie das nächste Mal „Enter“ drücken, werden Sie darüber informiert, dass der Vorgang abgeschlossen ist.
Lassen Sie uns nun sehen, was den Prozess nicht beendet. Wir werden es neu starten und dann das Terminalfenster schließen.
nohup. /long-proc
Wenn wir ein neues Terminalfenster öffnen und unseren Prozess mit finden pgrep
, können wir sehen, dass er noch läuft. Das Schließen des Terminalfensters, das den Prozess gestartet hat, hatte keine Wirkung.
pgrep long-proc
Sie können mehrere Befehle an übergeben nohup
, aber normalerweise ist es am besten, sie einzeln auszuführen. Dies macht es einfacher, sie als Hintergrundjobs zu manipulieren. Die Befehle werden nicht gleichzeitig, sondern nacheinander ausgeführt. Die Ausführung erfolgt nicht parallel, sondern sequentiell. Damit sie gleichzeitig funktionieren, müssen Sie sie separat ausführen.
Um jedoch mehrere Prozesse gleichzeitig auszuführen, verwenden nohup
Sie eine Bash-Shell zum Starten und Verwenden der -c
Option (Befehle) mit der Befehlszeile. Verwenden Sie einfache Anführungszeichen „ '
“, um die Liste der Befehle einzuschließen, und doppelte kaufmännische Und-Zeichen „ &&
“, um die Befehle zu trennen.
nohup bash -c 'ls /bin && ls /sbin'
Wenn Sie less
die Datei „nohup.out“ anzeigen, sehen Sie die Ausgabe des ersten Prozesses und dann die Ausgabe des zweiten Prozesses.
less nohup.out
Die Ausgabe beider Befehle wurde in der Datei „nohup.out“ erfasst. Dies ist nicht verflochten, die Ausgabe des zweiten Prozesses beginnt erst, nachdem der erste Prozess abgeschlossen ist.
Wenn Sie anstelle von „nohup.out“ eine eigene Datei verwenden möchten, können Sie den Befehl auf eine Datei Ihrer Wahl umleiten.
nohup bash -c 'ls /bin && ls /sbin' > myfile.txt
Beachten Sie, dass die Meldung nicht mehr „Adding output to nohupo.out“ lautet, sondern „stderr to stdout umleiten“ und wir stdout in unsere „myfile.txt“-Datei umleiten.
Wir können mit weniger Aufwand in die Datei „myfile.txt“ schauen.
less myfile.txt
Wie zuvor enthält es die Ausgabe beider Befehle.
Komischerweise kann die Geschichte des Utility manchmal den Eindruck erwecken, dass sie für die Gegenwart nicht relevant ist. Das Team nohup
ist einer von ihnen. Etwas, das geschaffen wurde, um mit seriellen Zeilenumbrüchen fertig zu werden, ist für heutige Linux-Benutzer auf unglaublich leistungsfähigen Rechnern immer noch nützlich.
Schreibe einen Kommentar