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

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

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


或者,这不是合法命令吗?或者,我是否需要将其手动移至背景,就像这样:

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


评论

你试过了吗?你得到什么错误?另外,我不确定您是否有错字或代码中的错误。 2> $ 1应该是2>&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,它将stderr移至地址1001,然后看到> file,该命令将stdout移至1008,但将stderr保持在1001。它不会拉动指向1001的所有内容并将其移至1008,而只是引用stdout并将其移至文件。
反之,它将stdout移至1008,然后将stderr也移动到stdout指向的点,也就是1008。这样,两者都可以指向单个文件。

评论


$之后,似乎无法捕获pid!

–碎肉
2015年12月2日,上午8:21

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

–丹
17年1月4日在21:33

#2 楼

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


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

评论


单行解释将使答案完整。

–anaik
17年7月7日在6:12

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

– P Pang
17-10-26在6:48

#3 楼

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

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

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


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

评论


哦,我懂了。您是说附加的“&”字符多余吗?

– djangofan
13年5月7日在20:32

我只引用手册页。由于nohup无论如何都会在后台执行命令,因此在后台执行nohup本身似乎是多余的

– RSFalcon7
13年5月8日,0:31

nohup不在后台执行命令,您必须显式附加&

– jlliagre
13年6月3日在22:34

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

–科恩。
16 Dec 30在15:09



#4 楼

tee命令也很普遍。

nohup java -jar myProgram.jar | tee output.log &

#5 楼

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