我可以同时将输出重定向到日志文件和后台进程吗?
换句话说,我可以做这样的事情吗?
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
将stderr移动到地址1001,然后它看到> 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
停止 with<Ctrl+Z>
并在后台继续 withbg
相当于&
在命令末尾执行 with 。
因此,对于在后台运行并重定向输出:
java -jar myProgram.jar 2> errorOutput.log > output.log &
如果您还需要该命令在您离开终端时不会消失,那么您应该使用nohup