2

所以我有这个简单的猴子补丁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,它是相同的,并且正在写入同一个流)。

问题:

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

流在关闭之前没有完成所有写入,甚至没有关闭。但是,如果我跑

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

现在子进程中运行的流将完成写入,并且日志文件现在已满。

为什么会这样?缺少 using fs.appendFileSync,有没有办法确保在进程关闭之前流将耗尽?

编辑:

我想我知道它为什么会发生 - 我正在调用process.exit()它会过早地关闭进程,并且可能会在流完成之前被调用。

有没有办法监听流何时完成写入?如果在我调用 process.exit() 时在流上调用 finish(),这似乎是人为的“完成”。我尝试等待“排水”事件,但它似乎永远不会触发。

4

1 回答 1

1

Streamwrite并且end可以在操作完成时进行回调。

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

drain仅当您可以恢复写入之前失败/阻塞的流时,才会触发该事件。

我不完全确定失败时end/write回调的语义。您可能需要添加超时,当然如果写入阻塞回调将不会运行,直到数据被刷新。

stream.end('end!', ()=> process.exit(0))
setTimeout(()=> {
  console.log('end timed out')
  process.exit(1)
}, 2000)
于 2017-04-19T23:41:33.500 回答