So verwenden Sie den nohup-Befehl unter Linux

So verwenden Sie den nohup-Befehl unter Linux

Der Linux-Befehl nohuplä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 HUPein 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 SIGHUPSignal an die Programme gesendet, damit sie informiert werden HUPund 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 nohupstartet untergeordnete Prozesse, weigert sich jedoch, SIGHUPsie 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, SIGHUPdamit 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 SIGHUPsignalisieren.

Das nohuptut es. Es führt Programme aus, damit Sie untergeordnete Prozesse nohupsind, keine untergeordneten Shell-Prozesse. Da sie keine untergeordneten Prozesse der Shell sind, empfangen sie nicht direkt SIGHUPvon der Shell. Und wenn nohuper es nicht SIGHUPan 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 nohupzum Starten eines Prozesses isoliert den Prozess vom nohupSignal. 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, nohupwas 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 nohupLä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 jobsden Befehl verwenden, um die Hintergrundaufgaben aufzulisten, die von diesem Terminalfenster aus ausgeführt werden.

jobs

Um unsere Aufgabe zu beenden, können wir killden 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 killdem Befehl verwenden. Der Befehl pgrepfindet 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 nohupSie eine Bash-Shell zum Starten und Verwenden der -cOption (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 lessdie 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 nohupist 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

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert