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

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

Kann ich die Ausgabe gleichzeitig in eine Protokolldatei und einen Hintergrundprozess umleiten?

Mit anderen Worten: Kann ich so etwas tun?

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

Oder ist das kein gültiger Befehl? Oder muss ich ihn manuell in den Hintergrund verschieben, wie hier:

java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1

Antwort1

Ein Problem mit Ihrem ersten Befehl ist, dass Sie stderr dorthin umleiten, wo stdout ist (wenn Sie das $ in ein & geändert haben, wie im Kommentar vorgeschlagen) und dann stdout in eine Protokolldatei umleiten, aber das zieht das umgeleitete stderr nicht mit. Sie müssen es in der anderen Reihenfolge tun, zuerst stdout dorthin schicken, wo Sie es haben wollen, und dann stderr an die Adresse schicken, an der stdout ist

some_cmd > some_file 2>&1 &

und dann könnten Sie das & einfügen, um es in den Hintergrund zu schicken. 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 Nummer verwenden, etwa kill %1so.

Außerdem können Sie ohne das & am Ende den Befehl mit anhalten Ctrlz, bgihn mit dem Befehl in den Hintergrund stellen und fgwieder in den Vordergrund holen. In Kombination mit dem jobsBefehl ist dies sehr wirkungsvoll.

um den obigen Teil über die Reihenfolge zu klären, in der Sie die Befehle schreiben. Angenommen, stderr hat die Adresse 1002, stdout hat die Adresse 1001 und die Datei ist 1008. Der Befehl wird von links nach rechts gelesen, daher sieht er in Ihrem zuerst, 2>&1dass which stderr an die Adresse 1001 verschiebt, dann sieht er, > filedass which stdout an 1008 verschiebt, aber stderr an 1001 belässt. Er zieht nicht alles, was auf 1001 zeigt, und verschiebt es an 1008, sondern verweist einfach auf stdout und verschiebt es an die Datei.
Umgekehrt verschiebt er stdout an 1008 und verschiebt dann stderr an den Punkt, auf den stdout zeigt, ebenfalls 1008. Auf diese Weise können beide auf die einzelne Datei zeigen.

Antwort2

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

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

Antwort3

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

Also, für die Ausführung im Hintergrund und die Umleitung der Ausgabe:

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

Wenn Sie außerdem möchten, dass dieser Befehl nicht beendet wird, wenn Sie das Terminal verlassen, sollten Sie Folgendes verwenden:nohup

Antwort4

Anstatt nohup zu verwenden, können Sie 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 und aufgrund einer schlechten Verbindung oder Inaktivität abgemeldet werden. Nach der Anmeldung können Sie die Arbeit dort fortsetzen, wo Sie aufgehört haben. sieheDasUndDasim Detail zu wissen.

verwandte Informationen