it-swarm.com.de

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

Kann ich die Ausgabe gleichzeitig in eine Protokolldatei umleiten und 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 rechtlicher Befehl? Oder muss ich es manuell in den Hintergrund verschieben, wie folgt:

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

Ein Problem mit Ihrem ersten Befehl besteht darin, dass Sie stderr an die Stelle umleiten, an der sich stdout befindet (wenn Sie das $ in ein & geändert haben, wie im Kommentar vorgeschlagen), und dann stdout in eine Protokolldatei umgeleitet haben, dies jedoch nicht entlang der umgeleiteten stderr . Sie müssen dies in der anderen Reihenfolge tun, zuerst stdout an die gewünschte Stelle senden und dann stderr an die Adresse senden, an der sich stdout befindet

some_cmd > some_file 2>&1 &

und dann könnten Sie das & auf werfen, um es in den Hintergrund zu schicken. Auf Jobs kann mit dem Befehl jobs zugegriffen werden. jobs zeigt Ihnen die laufenden Jobs und nummeriert sie. Sie könnten dann mit einem% über die Jobs sprechen, gefolgt von der Zahl wie kill %1 oder so.

Auch ohne das & am Ende können Sie den Befehl mit anhalten CtrlzVerwenden Sie den Befehl bg, um es in den Hintergrund zu stellen, und fg, um es wieder in den Vordergrund zu bringen. In Kombination mit dem Befehl jobs ist dies leistungsstark.

um den obigen Teil über die Reihenfolge zu klären, in der Sie die Befehle schreiben. Angenommen, stderr ist die Adresse 1002, stdout ist die Adresse 1001 und die Datei ist 1008. Der Befehl lautet von links nach rechts. Das erste, was in Ihrem Befehl angezeigt wird, ist 2>&1, das stderr an die Adresse 1001 verschiebt, sieht dann > file, das stdout auf 1008 verschiebt, aber stderr auf 1001 hält. Es zieht nicht alles, was auf 1001 zeigt, und verschiebt es auf 1008, sondern verweist einfach auf stdout und verschiebt es in die Datei.
Umgekehrt wird stdout auf 1008 und dann stderr auf den Punkt verschoben, auf den stdout zeigt, ebenfalls 1008. Auf diese Weise können beide auf die einzelne Datei verweisen.

192
Jacob Minshall
Java -jar myProgram.jar &> output.log &

Notiere dass der &> leitet sowohl stdout als auch stderr an output.log

20
Abhinav Bhatia

Anhalten mit <Ctrl+Z> und im Hintergrund mit bg fortzufahren, entspricht der Ausführung 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 beim Verlassen des Terminals nicht stirbt, sollten Sie Nohup verwenden

15
RSFalcon7

Der Befehl tee ist ebenfalls weit verbreitet.

Nohup Java -jar myProgram.jar | tee output.log &

2
trevorgrayson

Anstelle von Nohup können Sie auch den Bildschirm 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, wo Sie aufgrund einer schlechten Verbindung oder Inaktivität abgemeldet werden. Nach dem Anmelden können Sie die Arbeit dort fortsetzen, wo Sie sie verlassen haben. siehe this und this , um im Detail zu wissen.

2
Mani