为什么nodejs在等待片刻时关闭进程的stdout


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的输出已经完成了很长时间。Node.js通常不会为您缓冲未使用的管道。你必须在输出开始前用管道传输它,否则你会丢失数据,或者你必须.pause()

最新更新