2016-11-27 60 views
1

的stdout中当我启动一些后台进程在shell,例如:无法获得访问后台进程(Ubuntu的)

geth --maxpeers 0 --rpc & 

它返回类似:

[1] 1859 

...没有任何流出这个过程。我不明白它是什么?我怎样才能得到gethstdout?文件中有信息,后台进程的stdout默认显示在shell中。

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

回答

2

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

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

如果你不想在屏幕上看到的任何输出,双方stdout和stderr重定向到一个文件:

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

++,但值得注意的是,这只会沉默(重定向)_command的输出,而不是shell的作业控制消息。 – mklement0

+0

默认情况下,后台进程的stdout为何与终端窗口不关联?在我的情况下,它必须直接设置:'geth --rpc>&1&' – Mergasov

+0

@Mergasov:你说你正在运行shell _remotely_:你在使用什么软件?使用'ssh'应该不成问题。 geth写入输出有什么特别之处吗?其他生成stdout输出的命令的行为是否相同?乍一看,'&&1'看起来像没有操作。请直接向您的问题添加任何说明_。 – mklement0

2

关于你的问题的第一部分:

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

这是命令执行环境(部分外壳本身)的一部分,而不是你的脚本的结果。 (这是shell程序如何处理backgrounding你的脚本,并保持过程的轨迹,让暂停恢复作业)。

如果你看man bash根据JOB CONTROL,它解释了你所看到的细节,例如,

shell将作业与每个管道关联。它保留当前正在执行的作业的表 ,这些作业可能与jobs 命令一起列出。当bash(背景)异步启动工作, 它打印一行,看起来像:

[1] 25647 
1

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

距离bash的工作功能,这使得管理后台进程(作业)输出的,它包含了刚开始工作时,标准错误信息:

  • 1作业ID(它的前缀为%,可以与内置函数一起使用,例如killwait

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

更多的JOB CONTROL部分man bash

我该如何获得标准输出geth?文档中有信息说明后台进程的标准输出默认显示在shell中。

事实上,在默认情况下后台作业打印其输出到当前shell的输出和错误流,但请注意,这样做异步 - 也就是说,从后台作业输出会出现在它制造(潜在地被缓冲),与直接发送到当前shell的输出交织,这可能是破坏性的。

可以以捕捉其文件(S)输出,这表现在user3589054's helpful answer应用重定向像往常一样去后台命令,但请注意,这样做会不会沉默作业控制消息[1] 1859在上面的例子中)。

如果你想沉默创造的作业控制信息,使用方法:

{ geth --maxpeers 0 --rpc & } 2>/dev/null 

要消除作业的整个生命周期,请参阅我的this answer