process.stdout.write / process.stderr.write monkey-patch在subprocess中工作,但不是父进程

所以我在process.stdout.write / process.stderr.write上有这个简单的猴子补丁

  const strm = fs.createWriteStream(logfile); const stdoutWrite = process.stdout.write; process.stdout.write = function () { strm.write.apply(strm,arguments); stdoutWrite.apply(process.stdout, arguments); }; 

(对于process.stderr,它是相同的,正在写入同一个stream)。

问题:

当我用node x.js运行这个过程

该stream在closures之前并不完成全部写入,甚至不closures。 但是,如果我跑

 $ node y.js # this runs x.js in child process 

现在在子节点中运行的stream将完成写入,并且日志文件现在已满。

为什么会这样? 在使用fs.appendFileSync ,有没有一种方法可以确保在stream程closures之前数据stream将会stream失?

编辑:

我想我知道为什么会发生这种情况 – 我正在调用process.exit() ,它会提前closures进程,并可能在stream完成之前调用。

有没有一种方法来听stream何时写完? 如果调用process.exit()时,在stream上调用finish(),那似乎是一个人为的“完成”。 我试图等待“stream失”事件,但似乎从来没有开火。

数据stream的writeend可以在操作完成后进行callback。

 stream.end('end!', ()=> process.exit(0)) 

一旦您可以恢复写入到之前已经失败/被阻止的stream, drain事件只会触发。

我不完全确定end / writecallback失败的语义。 您可能需要添加一个超时,当然,如果写入数据被刷新,callback将不会运行。

 stream.end('end!', ()=> process.exit(0)) setTimeout(()=> { console.log('end timed out') process.exit(1) }, 2000)