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

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

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

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

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

答案4

您可以使用 screen 来代替 nohup。您可以实时查看程序的状态。您甚至可以将所有输出记录到文件中。当您通过 ssh 访问服务器并由于连接不良或不活动而注销时,它非常有用。登录后,您可以从上次离开的地方继续工作。参考详细了解。

相关内容