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

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

例如,当我输入 时ping 8.8.8.8 &,为什么我们可以看到 ping 进程正在运行?并且当我输入 时find / -name '*test*' &,它也显示在监视器上。

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

答案1

指示&shell 在后台运行该命令,即,它被分叉并在单独的子 shell 中作为作业异步运行。

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

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

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

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

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

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

fg <job-number>

可以job-number通过运行获得

jobs

答案2

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

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

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


此外,您可能想了解nohupdisown

答案3

我想尝试具体回答为什么:

这是为什么?

POSIX 作业控制实现,选择将 STDOUT、STDERR 附加到父终端[1]。我怀疑这是历史上的默认选择,也许是因为过去只有一个物理终端,没有模拟器,所以终端是所有作业都可以写入输出的唯一选择(?)

如果您创建的终端没有使用像 screen 这样的程序,并且如果您关闭了 SSH,您的终端和其中的 shell 就无法访问或者容易死机,那么 STDOUT/ERR 似乎很难恢复:https://superuser.com/questions/50058/after-the-fact-remote-nohup-with-tcsh/50077#50077尽管如那里的答案所示,如果父 shell 已放弃该进程,则可以通过附加 gdb 来完成。这也是终端仿真器如此有用的一个重要原因,因为交互式进程通常无法生存,除非每个进程都有自己的终端。

[1]https://www.gnu.org/software/libc/manual/html_node/Access-to-the-Terminal.html

相关内容