2017-04-19 95 views
1

所以我对process.stdout.write/process.stderr.writeprocess.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()时,似乎是人为的“完成”。我试图等待'流失'事件,但它似乎永远不会开火。

回答

1

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)