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


31

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

这是为什么?真的不是背景吗?

Answers:


43

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

请注意,将&输出(stdout和stderr)都仍将打印在屏幕上。如果你不想在屏幕上看到的任何输出,都重定向stdoutstderr以文件方式:

myscript > ~/myscript.log 2>&1 &

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

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

./script1 & ./script2 & ./script3 & 

可以在完成以下命令之前将后台作业带回到命令行:

fg <job-number>

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

jobs

好答案。/dev/null如果有人想放弃输出而不是将其保存在某个地方,则可以将其用作重定向终端输出的文件。我2>&1重定向stderr到正确stdout吗?也许您也想澄清一下...谢谢。
字节指挥官

@ByteCommander谢谢:)编辑,希望现在明白了。是的,您是对的, 2>&1重定向stderrstdout
罗恩

3
我认为值得一提的是,stty tostop如果后台作业尝试写入终端,则会导致后台作业被暂停。
卡巴斯德(Kasperd),2015年

cmd_with_params> / dev / null 2> / dev / null&
tgkprog

这样做的唯一缺点是,stdout和stderr的输出顺序可能会混入日志文件中。
matthieu

8

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

事实上,你可以运行ping 8.8.8.8 &find / -name '*test*' &在同一时间(导致混合输出),但你可能无法运行ping 8.8.8.8,并find / -name '*test*'在同一时间在同一个外壳。

如果您不想看到任何东西,请使用ping 8.8.8.8 &> /dev/null &


此外,您可能想了解nohupdisown


disown不会阻止输出到终端。
罗斯兰

@Ruslan:不,但是它将作业从外壳中删除。这可能(也可能不会)是什么,OP可以将感兴趣的内容。
安德烈Corbellini
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.