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

銀の弾丸

プログラミングに関して、いろいろ書き残していければと思っております。

Node.jsで正常終了:process.exit(0) は呼ばないほうが良いですね

Node.js JavaScript

「ダメ!絶対!」ということでも無いですが、Node.jsで、正常終了するとき、process.exit(0)と明示的に呼び出さないほうが良いですねっていう小ネタです。

※ ↓小ネタの割には土曜の朝からガッツリInkscapeしばいてました(笑)

f:id:takamints:20160402113544p:plain



勢い余って呼んじゃった

最近Node.jsでコマンドラインのツールを書くことが多いのです。 エラー処理とかキチンと書いて、かっこよくエラーメッセージなんか出しちゃったりしてご満悦。 「それじゃあ、ここでお父さん、終了コード1で終わっちゃうぞー」みたいにノリノリです。

で、勢い余って最後の行に「ここは正常終了ですよー」とニコヤカに、ついつい process.exit(0) と書いてしまった

その結果、「正常終了しているけれど、処理が正しくできてない」という、「おい!どうなってんだ?」ってな状況に困惑。わけわからん。

以下のようなコードです。

var fs = require("fs");
if(process.argv.length < 2) {
    console.error("エラー:ファイル名なし");
    process.exit(1);
}
fs.readFile(process.argv, "utf-8", function(err, data) {
    //
    //ファイルを読み込んであれこれする
    //
});
process.exit(0); //ここで正常終了ですよ

process.exitは「非同期処理を待ってくれない」

もうお気づきでしょうか、最後の行です。

これだと readFileのコールバックが呼ばれる前に、プロセスが正常終了しちゃいますね。

「nodeのプロセスは、全てのコールバックが終わってから終了する」けど、明示的にprocess.exitを呼び出したら、その時点で終了してしまいます。

これ当たり前。そうでなきゃ困るけど、意識してなかった。

呼び出さないほうがよい

ということで早速結論

Nodeのスクリプトで正常に処理を終了するときは、process.exitを呼び出さないほうが良い。

呼び出さなければ全部の処理を確実に実行してから、自動的に終了コード=0で終了してくれますが、 呼び出していると「これ、本当に全部の処理が行われてから正常終了しているの?」と疑うことが出来てしまいます。 コードレビューで指摘されると正統性を示すのが結構大変になりそうですし。

よく「呼び出す必要が無い」と説明されているのですが、もうチョット強めのニュアンスの方が良いのではないかと思います。 「呼び出さないほうがよい」ぐらいのほうが適当かと。

おまけ:0以外の終了コードで正常終了する方法

じゃあ0以外の終了コードで正常終了を表したい場合は、どうすればいいの?って思いますよね。

以下のようにすると良いですよ。

process.on("exit", function() {
    process.exit(1);
});

確認してみる。

$ node -e "process.on('exit', function(){process.exit(255);});"

$ echo $?
255

$

OKですね。


Nodeクックブック
Nodeクックブック
posted with amazlet at 16.04.02
David Mark Clements
オライリージャパン
売り上げランキング: 277,422