【问题标题】:Why nodejs close the stdout of process when waiting for a moment?为什么nodejs在等待片刻时关闭进程的标准输出?
【发布时间】:2018-11-21 07:12:36
【问题描述】:
const p = spawn('ls', ['/'])
console.log('$mark$')
p.stdout.pipe(process.stdout)

以上代码准确打印了根目录的文件列表,即:

$mark$
bin
boot
data
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
solr.log
srv
sys
tmp
usr
var

但是,如果我等待片刻,例如 1 秒,它不会打印任何内容。代码如下:

const p = spawn('ls')
setTimeout(() => {
  console.log('$mark$')
  p.stdout.pipe(process.stdout)
}, 1000)

只打印:

$mark$

我想知道为什么第二个代码不打印ls命令的任何内容。

环境:

  • Linux:openSUSE Leap 42.3
  • 节点:v8.11.1

【问题讨论】:

  • 我想这是完整的清单。现在想想这个。它“关闭”了吗?或者管道在进程退出之前根本就没有发生过?想一想。
  • 当您通过管道传输标准输出以处理 ls 命令时,该命令已完成,因此无需打印任何内容。 没有什么奇怪的
  • @Molda 那么如何在一段时间后捕获流?
  • 如果生成的进程稍后返回更多数据,它应该可以正常工作。 ls 命令立即返回数据并退出。
  • @Molda 更多数据不起作用,这只是一个最简单的演示案例。我有一个命令大约几秒钟,但它必须等待另一个任务才能捕获命令的输出。

标签: node.js stream pipe


【解决方案1】:

在您的第二个代码示例中,ls 在您尝试处理输出并将其通过管道传输时,其输出早已完成。 Node.js 通常不会为您缓冲未使用的管道。您必须在输出开始之前对其进行管道传输,否则您将丢失数据,或者您必须.pause()它。

【讨论】:

  • 所以没有控制它的选项,我处理。
  • @Run 当然有选择......正如我在回答中所说,暂停管道并稍后处理输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 2021-05-28
  • 2018-09-18
  • 2014-08-09
  • 1970-01-01
相关资源
最近更新 更多