无法访问后台进程的stdout(Ubuntu)

时间:2016-11-27 09:36:34

标签: shell ubuntu

当我在shell中启动一些后台进程时,例如:

geth --maxpeers 0 --rpc &

它返回类似:

[1] 1859

......没有任何这个过程的流出。我不明白它是什么?我如何获得stdout的{​​{1}}?文档中的信息默认情况下在shell中显示geth后台进程。

我的shell在远程Ubuntu系统中运行。

3 个答案:

答案 0 :(得分:2)

“&”指示shell在后台运行命令。它使用fork系统调用来创建子shell并异步运行作业。

stdout和stderr仍然应该打印到屏幕上。

如果您不想在屏幕上看到任何输出,请将stdout和stderr重定向到文件:

geth --maxpeers 0 --rpc > logfile 2>&1 &

答案 1 :(得分:2)

关于问题的第一部分:

  

......没有任何这个过程的流出。我不明白是什么   它?

这是命令执行环境(shell本身的一部分)的一部分,并不是您的脚本的结果。 (这是shell如何处理脚本的后台处理,并跟踪允许暂停恢复作业的过程。)

如果您查看man bash下的JOB CONTROL,它会详细说明您所看到的内容,例如

  

shell将作业与每个管道相关联。它保持一张桌子    当前正在执行的作业,可能与jobs一起列出    命令。当bash以异步方式(在后台)启动作业时,    它打印出一行如下:

    [1] 25647

答案 2 :(得分:1)

  

我不明白它是什么? [1] 1859

来自Bash的作业功能的输出,可以管理后台进程(作业),它包含有关刚刚启动的作业的信息,打印到stderr:< / p>

  • 1作业ID (以%为前缀)可与内置文件一起使用,例如kill和{{1} })

  • wait是后台流程的 PID (进程ID)。

25647的{​​{1}}部分了解详情。

  

如何获得JOB CONTROL的标准输出?文档中有信息,默认情况下,后台进程的标准输出显示在shell中。

实际上,默认情况下后台作业会将其输出打印到当前shell的stdout和stderr流,但请注意它们异步 - 即后台作业的输出将在生成(可能是缓冲的)时出现,与直接发送到当前shell的输出交错,这可能是破坏性的。

您可以像往常一样将重定向应用于后台命令,以便在文件中捕获其输出,如user3589054's helpful answer中所示,但请注意,这样做不会使作业控制消息(上例中的man bash)。

如果您想在创建时静音作业控制消息,请使用:

geth

要使工作的整个生命周期保持沉默,请参阅我的this answer