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

dja*_*fan 176 shell bash shell-script

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

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

nohup java -jar myProgram.jar 2>&1 > output.log &
Run Code Online (Sandbox Code Playgroud)

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

java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1
Run Code Online (Sandbox Code Playgroud)

Jac*_*all 246

您的第一个命令的一个问题是您将 stderr 重定向到 stdout 所在的位置(如果您按照评论中的建议将 $ 更改为 & ),然后将 stdout 重定向到某个日志文件,但这并没有拉动重定向的 stderr . 您必须按其他顺序执行,首先将 stdout 发送到您希望它去的地方,然后将 stderr 发送到 stdout 所在的地址

some_cmd > some_file 2>&1 &
Run Code Online (Sandbox Code Playgroud)

然后你可以抛出 & 将其发送到后台。可以使用该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` 放在命令行中错误位置时出错的可能性。 (16认同)

小智 32

java -jar myProgram.jar &> output.log &
Run Code Online (Sandbox Code Playgroud)

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

  • 单行解释将使答案完整。 (7认同)
  • @abhisheknaik96 它运行 jar 文件并将 stdin 和 stderr 重定向到 output.log 并使其成为后台进程。 (2认同)

RSF*_*on7 17

<Ctrl+Z>在后台停止和继续bg执行相当于&在命令的末尾执行。

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

java -jar myProgram.jar 2> errorOutput.log > output.log &
Run Code Online (Sandbox Code Playgroud)

如果你还需要这个命令在你离开终端时不会死掉,那么你应该使用 nohup

  • nohup 不在后台执行命令,你必须显式附加`&amp;` (12认同)
  • 使用 `bg` 将进程移至后台后,您可以通过运行 `disown` 将其与会话分离,这使得关闭终端时进程不会终止。 (4认同)

小智 6

tee命令也非常普遍。

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


小智 5

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