Answers:
第一个命令的一个问题是您将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。这样,两者都可以指向单个文件。
$!
&> file.out
将stdin和stdout都重定向到输出文件,这可以减少2>&1
在命令行中放置错误的可能性。
停止<Ctrl+Z>
并在后台继续使用bg
等效于&
在命令末尾执行。
因此,要在后台运行并重定向输出:
java -jar myProgram.jar 2> errorOutput.log > output.log &
如果您还需要在离开终端时不死此命令,则应使用 nohup
&
bg
,可以通过运行将其从会话中分离出来disown
,这使该进程在关闭终端时不会消失。
2>$1
大概应该是2>&1
。