読者です 読者をやめる 読者になる 読者になる

15 min/d

ぼうずやのにっき

process.exit() で stdout / stderr が flush されない bug をふんだ

2016-06-06 に書いた bouzuya/eater-b-reporter 。それをつくった際に踏んだ Node.js の bug (nodejs/node#6773) について書く。

これは process.exit() された際に stdour/stderr が flush されない問題だ。eater-b-reporter では Error を表示した際に最後まで出力されることなく process が終了される形で起きた。

yosuke-furukawa/eater は Error がある場合に exit code 1 で終了させる。そのために process.exit(1) を呼び出す。この process.exit(1) が上記の bug により stdout/stderr に残った buffer を無視して終了させる。

現状、あまり良さそうな対策はない。上記 pull request にも挙がっている stdout/stderr を blocking する案 (nodejs/node#6456) を採ると、とりあえずは直せる。その特性からして効率は悪くなるだろうけど……。

bouzuya/eater-b-reporternodejs/node#6456 を npm package 化した yargs/set-blocking を使っている。Node.js の version が上がって直ってくれれば削除する予定だ。