为什么我可以看到后台进程的输出?

NoF*_*nce 40 command-line

例如,当我输入 时ping 8.8.8.8 &,为什么我们可以看到 ping 进程在工作?当我输入时find / -name '*test*' &,它也会在监视器上看到。

这是为什么?它真的不是在后台吗?

Ron*_*Ron 56

&引导外壳在后台运行的命令,即,它被分叉并在一个单独的子壳运行,作为作业,异步。

请注意,当您放置&输出时——stdout 和 stderr——仍将打印到屏幕上。如果您不想在屏幕上看到任何输出,请通过以下方式将stdout和重定向stderr到文件:

myscript > ~/myscript.log 2>&1 &
Run Code Online (Sandbox Code Playgroud)

通常stderr/dev/null如果您不担心稍后分析错误,您可能希望通过将其重定向到来丢弃。

您甚至可以在单独的子 shell 中同时运行命令/脚本。例如;

./script1 & ./script2 & ./script3 & 
Run Code Online (Sandbox Code Playgroud)

后台作业可以在使用以下命令完成之前返回到命令行:

fg <job-number>
Run Code Online (Sandbox Code Playgroud)

所述job-number可以通过运行而获得

jobs
Run Code Online (Sandbox Code Playgroud)

  • 我认为值得一提的是,如果他们尝试写入终端,`stty tostop` 将导致后台作业被暂停。 (3认同)

And*_*ini 11

当您使用 时&,该进程在后台运行。但它的标准输出仍然是终端。

事实上,您可能同时运行ping 8.8.8.8 &and find / -name '*test*' &(导致混合输出),但您可能不会在同一个 shell 上同时运行ping 8.8.8.8and find / -name '*test*'

如果您不想看到任何内容,请使用类似ping 8.8.8.8 &> /dev/null &.


此外,您可能想了解nohupdisown