pm2 で Nodeアプリケーションのプロセスを管理する

Node.js

pm2概要

Node.js のアプリケーションは単一プロセス・単一スレッドで動作するという特性がある。ということはマルチコアCPUであってもそれを有効に使うことができない。

これを解消する方法は2つある。一つ目は cluster モジュールを使うこと。このモジュールを使えばマルチプロセスを扱うことができる。二つ目はプロセス管理ツールを使うことだ。pm2 はそのプロセス管理ツールのひとつ。

主なコマンド

主なコマンドについて。詳細は pm2 -h で確認すること。

  • pm2 start pm2.yaml
  • pm2 restart app_name
  • pm2 kill – デーモンを停止する
  • pm2 list / pm2 ls / pm2 status / pm2 ps – プロセスの一覧を表示する。どれも同じ内容
  • pm2 logs – ログファイルのストリームを表示。デフォルトでは全てのログが出力されるがオプションでフィルタリングしたりアプリ指定もできる
  • pm2 monit – termpcap 形式でモニタリングできる

トラブルシューティング

too many unstable restarts

再起動時に pm2 logs で以下のエラーが発生。pm2 status を見ると status が Errored になっていた。

PM2 log: App name:app id:1 disconnected
PM2 log: App [app:4] exited with code [0] via signal [SIGINT]
PM2 log: Script index.js had too many unstable restarts (16). Stopped. “errored”

エラーログを見ると以下のログ。

Error: Cannot find module ‘module_name’

pm2 kill をしてから再度起動すると解決した。

その他

docker では pm2-runtime を使う

Docker コンテナ内では pm2 をグローバルインストールした状態で pm2-runtime コマンドを使う。

.pm2

実行ユーザのホームディレクトリ下に .pm2/ というディレクトリが作成されて、デーモンプロセスの情報がここに残る。起動後に別のユーザでログインして pm2 を使っても元のプロセスの情報を得られない。

.pm2 フォルダは環境変数 PM2_HOME に作成されるため、環境変数を設定することでどのユーザで実行しても pm2 の状況を確認できるようにすることも可能。ただし環境変数の設定だけではアクセス権が足りないので、実行ユーザ以外でプロセスを操作することはできない。$PM2_HOME の権限変更も忘れないこと。

.pm2との付き合い方
タイトルとURLをコピーしました