Leiten Sie nohup auf stdout um

15

Ist es möglich, einen Prozess mit nohup starten zu lassen, statt in eine Datei in stdout zu schreiben? oder vielleicht in der datei und auf dem bildschirm?

nohup python start.py &

schreibt an nohup.out, aber ich möchte, dass es auf dem Bildschirm ausgegeben wird, nohup ist nur als Absicherung gedacht, wenn die Verbindung unterbrochen wird.

Davoud Taghawi-Nejad
quelle
Aber was passiert, wenn Ihr Programm nach dem Verbindungsabbruch eine Ausgabe ausführt?
womble

Antworten:

10

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.outansonsten. 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 nohupProgramms 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.

dsh
quelle
1
Ein netter Zusatz: Wenn der Befehl nohup bereits mit einem Dateinamen gestartet wurde, können Sie tail -f filenamedamit sehen, was in die Datei geschrieben wird.
Hennes
Funktioniert nicht, sobald die Verbindung beendet ist, wird die Datei nicht mehr geschrieben
Davoud Taghawi-Nejad
Sie haben Recht: Ich habe die Frage beantwortet (Ausgabe an das Terminal senden), aber den Zweck besiegt. Ich habe meine Antwort entsprechend umgeschrieben.
dsh
3
  1. nohup python start.py & tail -f nohup.out Der tail -fkann nach Belieben getötet und neu gestartet werden.

  2. screen python start.py und nach Belieben trennen / wieder verbinden.

Henk Langeveld
quelle