Von man nohup
:
Wenn es sich bei der Standardeingabe um ein Terminal handelt, leiten Sie es von / dev / null um. Wenn es sich bei der Standardausgabe um ein Terminal handelt, hängen Sie die Ausgabe an, nohup.out
wenn möglich, $HOME/nohup.out
ansonsten. Wenn der Standardfehler ein Terminal ist, leiten Sie ihn zur Standardausgabe um. Verwenden Sie, um die Ausgabe in FILE zu speichern nohup COMMAND > FILE
.
(Vollständig überarbeitet, basierend auf Kommentaren)
Beim Verlassen einer Shell oder Schließen eines Terminals werden die untergeordneten Prozesse mit SIGHUP (Auflegen, der Name stammt aus der Zeit, als sich Terminals in den UNIX-Computer einwählen) gesendet, um ihnen mitzuteilen, dass es sich bei dem Terminal um Nein handelt länger verbunden. Wenn der Shell-Prozess beendet wird, werden außerdem die Streams stdin, stdout und stderr des untergeordneten Prozesses geschlossen. Normalerweise führt dies dazu, dass der untergeordnete Prozess stirbt. Normalerweise ist dies eine gute Sache, da vermieden wird, dass Prozesse ohne Benutzer ausgeführt werden.
Der Zweck des nohup
Programms besteht darin, den Prozess auch nach dem Beenden der Shell und dem Trennen der Verbindung zum Terminal weiter laufen zu lassen. Das Leiten der Ausgabe an das Terminal ist dementsprechend zweckentfremdend. Meine ursprüngliche Antwort ( nohup COMMAND | cat
) war nicht hilfreich, weil: Wenn das Terminal geschlossen ist, wird die Ausgabe der Katze geschlossen und so stirbt die Katze, was die Pipe bricht und ein SIGPIPE an den Nohup-Prozess sendet, wodurch sie abstirbt. Ich hatte die Frage beantwortet, ohne an den Zweck zu denken.
Um Ihren Zweck zu erreichen, führen Sie aus nohup COMMAND > FILE
, um den Namen der Datei auszuwählen, an die die Ausgabe erfolgen soll. Verwenden Sie dann tail -f FILE
, um die Ausgabe auf einem Terminal anzusehen.
In ähnlicher Weise könnte man das folgende Shell-Konstrukt verwenden: COMMAND >FILE 2>&1 </dev/null &
um einen Befehl auszuführen, dessen stdio-Streams nicht mit dem Terminal verbunden sind und nach dem Schließen des Terminals weiter ausgeführt werden können. Führen Sie in zsh außerdem die integrierte Shell aus disown
, um zsh anzuweisen , den Prozess zu verlassen, anstatt ihn zu beenden , wenn die Shell endet.