6

非同期処理を多用したスクリプトで、全ての処理が完了してもプロセスが終了しないという現象が以前発生しました。当時はとりあえず一定時間を超えてプロセスが残っていたら強制終了するような仕組みで対応したのですが、最近になって「なにか非同期処理やタイマーが残っていてイベントループが終了しなかったのでは?」という仮説が浮かびあがりました。

処理が完了したところで process.exit(0) を呼べば確実に終了することはできると思いますが、実装にミスがある可能性を考えると、放置していても終了しない理由が知りたいです。

Node.jsのプロセスが意図せずして動き続けている場合、どのように調査するとよいでしょうか?

unarist
  • 14,871
  • 5
  • 35
  • 78

1 Answers1

4

processモジュールにドキュメント化されていないAPIがあります。

process._getActiveHandles();
process._getActiveRequests();

これらを使うと、Worker queueに残っているもの(プロセスを活かし続けているもの)を確認できるかもしれません。

htb
  • 2,027
  • 3
  • 15
  • 35
  • なるほど。そのメソッドで調べてみると、得られたハンドルの出所をわかりやすく表示できるモジュールもあるようですね。 https://github.com/thlorenz/active-handles https://github.com/myndzi/wtfnode – unarist Nov 17 '19 at 14:37