process.stdout.write / process.stderr.write monkey-patch 在子进



所以我在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

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

为什么会这样呢?除了使用fs.appendFileSync,有没有办法确保流在进程关闭之前排出?

编辑:

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

有没有办法在流完成写入时侦听?如果我在调用process.exit()时在流上调用finish(),这似乎是人为的"完成"。我尝试等待"排水"事件,但它似乎从未触发。

writeend可以在操作完成时进行回调。

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)

最新更新