銀の弾丸

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

Node.jsで正常終了するとき process.exit(0) を呼んではいけない

f:id:takamints:20160402113544p:plain

Node.jsで正常終了するとき、 process.exit(0) を明示的に呼び出すべきではないってことを書いています。



関連記事:

takamints.hatenablog.jp

勢い余って呼んじゃった

Node.jsでコマンドラインのツールを書くとき、特に他の人に使ってもらうようなものだと特に、エラー処理をキチンと書くように努めています。

エラーメッセージを分かりやすく表示して、process.exit(-1) で、OSに対して異常終了を示すわけですが、勢い余って正常終了時に、ついつい 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