Kann ich die Ausgabe in eine Protokolldatei umleiten und gleichzeitig einen Prozess im Hintergrund ausführen?

116

Kann ich die Ausgabe in eine Protokolldatei umleiten und gleichzeitig einen Prozess im Hintergrund ausführen?

Mit anderen Worten, kann ich so etwas tun?

nohup java -jar myProgram.jar 2>&1 > output.log &

Oder ist das kein gesetzlicher Befehl? Oder muss ich es wie folgt manuell in den Hintergrund verschieben:

java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1
Djangofan
quelle
2
Hast du es versucht? Welchen Fehler bekommst du? Ich bin mir auch nicht sicher, ob Sie einen Tippfehler oder einen Fehler in Ihrem Code haben. 2>$1soll wohl sein 2>&1.
Patrick

Antworten:

171

Ein Problem bei Ihrem ersten Befehl besteht darin, dass Sie stderr an die Position stdout umleiten (wenn Sie das $ in ein & geändert haben, wie im Kommentar vorgeschlagen) und dann stdout in eine Protokolldatei umleiten, ohne dass dabei das umgeleitete stderr mitgezogen wird . Sie müssen dies in der anderen Reihenfolge tun, indem Sie zuerst stdout an den gewünschten Ort senden und dann stderr an die Adresse senden, an der stdout sich befindet

some_cmd > some_file 2>&1 &

und dann können Sie das & aktivieren, um es in den Hintergrund zu stellen. Auf Jobs kann mit dem jobsBefehl zugegriffen werden . jobszeigt Ihnen die laufenden Jobs und nummeriert sie. Sie könnten dann über die Jobs sprechen, indem Sie ein% gefolgt von der Zahl wie kill %1oder so verwenden.

Auch ohne die & am Ende des Befehls mit suspendieren können Ctrlz, verwenden Sie den bgBefehl im Hintergrund zu setzen und fgsie wieder in den Vordergrund zu bringen. In Kombination mit dem jobsBefehl ist dies mächtig.

Um den obigen Teil über die Reihenfolge zu klären, schreiben Sie die Befehle. Angenommen, stderr ist die Adresse 1002, stdout ist die Adresse 1001 und die Datei ist 1008. Der Befehl liest von links nach rechts, so dass das erste, was er in Ihnen sieht, ist, 2>&1was stderr zur Adresse 1001 verschiebt, und dann sieht, > filewelches stdout zu 1008 verschiebt. Es wird nicht alles auf 1001 gezogen und auf 1008 verschoben, sondern es wird einfach auf stdout verwiesen und in die Datei verschoben.
Umgekehrt wird stdout auf 1008 verschoben und dann stderr auf den Punkt, auf den stdout zeigt, ebenfalls 1008. Auf diese Weise können beide auf die einzelne Datei verweisen.

Jacob Minshall
quelle
kann nicht scheinen, die PID danach zu erfassen, obwohl mit$!
chovy
8
Ebenfalls erwähnenswert: Sie können &> file.outsowohl stdin als auch stdout in eine Ausgabedatei umleiten, wodurch die Möglichkeit eines Fehlers bei der Eingabe 2>&1an der falschen Stelle in der Befehlszeile verringert wird.
Dan
14

Das Stoppen mit <Ctrl+Z>und das Fortsetzen im Hintergrund mit bgentspricht dem Ausführen mit &am Ende des Befehls.

Also, um im Hintergrund zu laufen und die Ausgabe umzuleiten:

java -jar myProgram.jar 2> errorOutput.log > output.log &

Wenn Sie auch benötigen, dass dieser Befehl nicht stirbt, wenn Sie das Terminal verlassen, sollten Sie verwenden nohup

RSFalcon7
quelle
Oh ich verstehe. Sie sagen, das angehängte '&' Zeichen ist überflüssig?
Djangofan
Ich zitiere nur die Manpage. Da nohup den Befehl ohnehin im Hintergrund ausführt, erscheint es überflüssig, nohup selbst im Hintergrund auszuführen
RSFalcon7
10
nohup führt den Befehl nicht im Hintergrund aus, Sie müssen explizit &
Folgendes
3
Nachdem Sie einen Prozess mit in den Hintergrund verschoben haben bg, können Sie ihn durch Ausführen von Ihrer Sitzung trennen disown, wodurch der Prozess nicht abstürzt, wenn Sie das Terminal schließen.
Koen.
14
java -jar myProgram.jar &> output.log &

Beachten Sie, dass &>sowohl stdout als auch stderr an output.log weitergeleitet werden

Abhinav Bhatia
quelle
3
Eine einzeilige Erklärung vervollständigt die Antwort.
Anaik
2
@ abhisheknaik96 es führt die jar-datei aus und leitet sowohl stdin als auch stderr zu output.log um und macht es zum hintergrundprozess.
P Pang
2

Anstelle von nohup können Sie auch screen verwenden. Sie können den Status des Programms in Echtzeit anzeigen. Sie können sogar die gesamte Ausgabe in einer Datei protokollieren. Dies ist nützlich, wenn Sie über ssh auf den Server zugreifen, bei dem Sie aufgrund einer schlechten Verbindung oder Inaktivität abgemeldet werden. Nach dem Einloggen können Sie die Arbeit dort fortsetzen, wo Sie aufgehört haben. Verweisen Sie dies und dies im Detail zu wissen.

Mani
quelle
1

Der teeBefehl ist auch ziemlich verbreitet.

nohup java -jar myProgram.jar | tee output.log &

Trevorgrayson
quelle