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
bash
shell
shell-script
Djangofan
quelle
quelle
2>$1
soll wohl sein2>&1
.Antworten:
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
und dann können Sie das & aktivieren, um es in den Hintergrund zu stellen. Auf Jobs kann mit dem
jobs
Befehl zugegriffen werden .jobs
zeigt Ihnen die laufenden Jobs und nummeriert sie. Sie könnten dann über die Jobs sprechen, indem Sie ein% gefolgt von der Zahl wiekill %1
oder so verwenden.Auch ohne die & am Ende des Befehls mit suspendieren können Ctrlz, verwenden Sie den
bg
Befehl im Hintergrund zu setzen undfg
sie wieder in den Vordergrund zu bringen. In Kombination mit demjobs
Befehl 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>&1
was stderr zur Adresse 1001 verschiebt, und dann sieht,> file
welches 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.
quelle
$!
&> file.out
sowohl stdin als auch stdout in eine Ausgabedatei umleiten, wodurch die Möglichkeit eines Fehlers bei der Eingabe2>&1
an der falschen Stelle in der Befehlszeile verringert wird.Das Stoppen mit
<Ctrl+Z>
und das Fortsetzen im Hintergrund mitbg
entspricht dem Ausführen mit&
am Ende des Befehls.Also, um im Hintergrund zu laufen und die Ausgabe umzuleiten:
Wenn Sie auch benötigen, dass dieser Befehl nicht stirbt, wenn Sie das Terminal verlassen, sollten Sie verwenden
nohup
quelle
&
bg
, können Sie ihn durch Ausführen von Ihrer Sitzung trennendisown
, wodurch der Prozess nicht abstürzt, wenn Sie das Terminal schließen.Beachten Sie, dass
&>
sowohl stdout als auch stderr an output.log weitergeleitet werdenquelle
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.
quelle
Der
tee
Befehl ist auch ziemlich verbreitet.nohup java -jar myProgram.jar | tee output.log &
quelle