![我可以將輸出重定向到日誌檔案並同時將進程置於背景嗎?](https://rvso.com/image/31666/%E6%88%91%E5%8F%AF%E4%BB%A5%E5%B0%87%E8%BC%B8%E5%87%BA%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E6%97%A5%E8%AA%8C%E6%AA%94%E6%A1%88%E4%B8%A6%E5%90%8C%E6%99%82%E5%B0%87%E9%80%B2%E7%A8%8B%E7%BD%AE%E6%96%BC%E8%83%8C%E6%99%AF%E5%97%8E%EF%BC%9F.png)
我可以同時將輸出重定向到日誌檔案和後台進程嗎?
換句話說,我可以做這樣的事情嗎?
nohup java -jar myProgram.jar 2>&1 > output.log &
或者說,這不是一個合法的命令嗎?或者,我是否需要手動將其移至後台,如下所示:
java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1
答案1
第一個命令的一個問題是,您將stderr 重定向到stdout 所在的位置(如果您按照註釋中的建議將$ 更改為& ),然後將stdout 重定向到某個日誌文件,但這並沒有拉動重定向的stderr 。您必須按照其他順序執行此操作,首先將 stdout 傳送到您想要的位置,然後將 stderr 傳送到 stdout 所在的位址
some_cmd > some_file 2>&1 &
然後你可以添加 & 將其發送到後台。可以使用jobs
指令存取作業。jobs
將向您顯示正在執行的作業,並對其進行編號。然後,您可以使用 % 後跟類似的數字來談論工作kill %1
。
另外,如果末尾沒有 & ,您可以使用 暫停命令Ctrlz,使用該bg
命令將其置於後台並將fg
其帶回前台。與jobs
命令結合起來,這個功能就很強大了。
澄清上面關於編寫命令的順序的部分。假設stderr是位址1002,stdout是位址1001,檔案是1008 2>&1
。> file
哪一個將stdout移到1008,但將 stderr 保持在 1001。 它不會拉出所有指向 1001 的內容並將其移動到 1008,而只是引用 stdout 並將其移動到文件。
相反,它將 stdout 移動到 1008,然後將 stderr 移動到 stdout 指向的點,即 1008。這樣兩者都可以指向單一檔案。
答案2
java -jar myProgram.jar &> output.log &
請注意,將&>
stdout 和 stderr 定向到 output.log
答案3
停止<Ctrl+Z>
並在背景繼續執行bg
相當於&
在命令末尾執行。
因此,對於在背景運行並重定向輸出:
java -jar myProgram.jar 2> errorOutput.log > output.log &
如果您還需要該命令在您離開終端時不會消失,那麼您應該使用nohup