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的write
和end
可以在操作完成后进行callback。
stream.end('end!', ()=> process.exit(0))
一旦您可以恢复写入到之前已经失败/被阻止的stream, drain
事件只会触发。
我不完全确定end
/ write
callback失败的语义。 您可能需要添加一个超时,当然,如果写入数据被刷新,callback将不会运行。
stream.end('end!', ()=> process.exit(0)) setTimeout(()=> { console.log('end timed out') process.exit(1) }, 2000)