2017-04-19 94 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)