我可以同时将输出重定向到日志文件和后台进程吗?


116

我可以同时将输出重定向到日志文件和后台进程吗?

换句话说,我可以做这样的事情吗?

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

或者,这不是合法命令吗?或者,是否需要手动将其移至后台,如下所示:

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

2
你试过了吗?你得到什么错误?另外,我不确定您是否有错字或代码中的错误。2>$1大概应该是2>&1
帕特里克

Answers:


171

第一个命令的一个问题是您将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将stderr移至地址1001,然后看到> file哪个将stdout移至1008,但是将stderr保持在1001。它不会拉动指向1001的所有内容并将其移动到1008,而只是引用stdout并将其移动到文件中。
相反,它将stdout移动到1008,然后将stderr移动到stdout指向的点,也就是1008。这样,两者都可以指向单个文件。


在此之后似乎无法捕获pid$!
chovy

8
还值得注意的是:您可以使用&> file.out将stdin和stdout都重定向到输出文件,这可以减少2>&1在命令行中放置错误的可能性。

14

停止<Ctrl+Z>并在后台继续使用bg等效于&在命令末尾执行。

因此,要在后台运行并重定向输出:

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

如果您还需要在离开终端时不死此命令,则应使用 nohup


哦,我明白了。您是说附加的“&”字符多余吗?
djangofan 2013年

我只引用了联机帮助页。由于nohup无论如何都会在后台执行命令,因此看起来似乎多余在后台执行nohup本身
RSFalcon7 2013年

10
nohup不在后台执行命令,您必须显式追加&
jlliagre 2013年

3
使用将该进程移至后台后bg,可以通过运行将其从会话中分离出来disown,这使该进程在关闭终端时不会消失。
科恩

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

请注意,&>将stdout和stderr都定向到output.log


3
单行解释将使答案完整。
anaik

2
@ abhisheknaik96它运行jar文件,并将stdin和stderr都重定向到output.log并使它成为后台进程。
P庞

2

除了使用nohup,还可以使用屏幕。您可以实时查看程序状态。您甚至可以将所有输出记录到文件中。当您通过ssh访问服务器时(由于连接不良或不活动而被注销),该功能很有用。登录后,您可以从离开的地方继续工作。参照这个这个详细了解。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.