的stdout中当我启动一些后台进程在shell,例如:无法获得访问后台进程(Ubuntu的)
geth --maxpeers 0 --rpc &
它返回类似:
[1] 1859
...没有任何流出这个过程。我不明白它是什么?我怎样才能得到geth
的stdout
?文件中有信息,后台进程的stdout
默认显示在shell中。
我的shell正在远程Ubuntu系统中运行。
的stdout中当我启动一些后台进程在shell,例如:无法获得访问后台进程(Ubuntu的)
geth --maxpeers 0 --rpc &
它返回类似:
[1] 1859
...没有任何流出这个过程。我不明白它是什么?我怎样才能得到geth
的stdout
?文件中有信息,后台进程的stdout
默认显示在shell中。
我的shell正在远程Ubuntu系统中运行。
“&”指示shell在后台运行该命令。它使用fork系统调用来创建子shell并异步运行作业。
stdout和stderr仍然应该被打印到屏幕上。
如果你不想在屏幕上看到的任何输出,双方stdout和stderr重定向到一个文件:
geth --maxpeers 0 --rpc > logfile 2>&1 &
关于你的问题的第一部分:
..没有任何流程的这个过程。我不明白 是什么呢?
这是命令执行环境(部分外壳本身)的一部分,而不是你的脚本的结果。 (这是shell程序如何处理backgrounding你的脚本,并保持过程的轨迹,让暂停和恢复作业)。
如果你看man bash
根据JOB CONTROL
,它解释了你所看到的细节,例如,
shell将作业与每个管道关联。它保留当前正在执行的作业的表 ,这些作业可能与
jobs
命令一起列出。当bash(背景)异步启动工作, 它打印一行,看起来像:[1] 25647
我不明白是什么呢?
[1] 1859
距离bash的工作功能,这使得管理后台进程(作业)输出的,它包含了刚开始工作时,标准错误信息:
1
是作业ID(它的前缀为%
,可以与内置函数一起使用,例如kill
和wait
)
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。
++,但值得注意的是,这只会沉默(重定向)_command的输出,而不是shell的作业控制消息。 – mklement0
默认情况下,后台进程的stdout为何与终端窗口不关联?在我的情况下,它必须直接设置:'geth --rpc>&1&' – Mergasov
@Mergasov:你说你正在运行shell _remotely_:你在使用什么软件?使用'ssh'应该不成问题。 geth写入输出有什么特别之处吗?其他生成stdout输出的命令的行为是否相同?乍一看,'&&1'看起来像没有操作。请直接向您的问题添加任何说明_。 – mklement0