pm2によるプロセス管理

関連投稿
PM2のアプリケーションルートの設定

Node.jsでプログラムをバックグラウンドでプロセス起動させるNode.jsモジュールのpm2に関する備忘録。

サーバーサイドなjavascriptコードを記述して、試しに起動する程度であれば、コンソールからnodeコマンドで実行したり、Visual Studio Codeなどのエディタに搭載されているデバッガ起動すればよい。ただ本格稼動させるとなると、ずっとコンソールで立ち上げておくわけにも行かない。

こういった場合Nodeモジュールのpm2を使うと、簡単にバックグラウンドプロセス化と監視ができるようになる。

導入

npmでグローバル領域にインストールする

> npm install pm2 -g

Ubuntu16.02LTSからsystemdでサービス化

Ubuntu14までは、initによるサービス化でしたが、Ubuntu16からは、systemdによるサービス管理になる。

サービス化の方法は、

> sudo pm2 startup ubuntu

と実行すると、「以下のコマンドを実行して」と正解が出力される。

> sudo "env PATH=$PATH:/usr/local/bin pm2 startup ubuntu -u <user> --hp /home/<user>

ポイントは-uで、実行ユーザを指定ことで、ここで指定したユーザでアプリケーションが起動される。なので、アプリケーション内でファイルやフォルダを作成すると、そのユーザのパーミッションになる。

また/home/<user>/.pm2/logsにアプリケーションのログが作成されるが、適当にrootユーザでpm2を実行すると、その後にユーザ指定してもパーミッションでログが書き込めずに起動しないなどでハマルので注意する。

あと、systemdへの登録が成功すると、/etc/systemd/system/pm2.serviceという設定ファイルが作成されて、プロセスの起動、停止などの実行パスを設定できる。

[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target

[Service]
User=<user>
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=8
Environment=PATH=/usr/local/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/<user>/.pm2
Restart=always
RestartSec=8

ExecStart=/usr/local/lib/node_modules/pm2/bin/pm2 resurrect --no-daemon
ExecReload=/usr/local/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/usr/local/lib/node_modules/pm2/bin/pm2 kill

[Install]
WantedBy=multi-user.target

なので、/etc/init.d以下にpm2のスクリプトは作成されない。
サービスの起動および停止は、

> sudo systemctrl [stop/start] pm2

状態確認は、

> sudo systemctrl status pm2

initシステム同様に自分の作成したスクリプトなどをサービス化やcron化することも可能らしいので、ちゃんと押さえておく必要がある。

使い方

pm2はコンソールで実行する>node app.jsをバックグラウンドで実行し、現在nodeコマンドで実行されたプロセス一覧や状況をモニタできるようになる。
また、各プロセスに名前をつけることができるので、一覧表示したときに視認しやすくなる。

  • 基本
> pm2 [command] [app]
  • pm2でプログラム(app1の起動スクリプトapp.js)を起動し、プロセスリストでの表示名を”hoge”にする
> pm2 start app1/app.js --name "hoge"
[PM2] Starting app.js in fork_mode (1 instance)
[PM2] Done.
  • pm2で起動中のプログラムを停止する(管理対象からは除去されない)
> pm2 stop app1/app.js
[PM2] Stopping hello
[PM2] stopProcessId process id 0
  • pm2で起動中のプログラムを再起動する
> pm2 restart app1/app.js
  • pm2で監視されているプログラムの一覧を表示する
> pm2 list

┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐ 
│ App name │ id │ mode │ pid  │ status │ restart │ uptime │ memory      │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤ 
│ hello    │ 0  │ fork │ 6596 │ online │ 1       │ 0s     │ 28.242 MB   │ disabled │ 
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘
  • プログラムの詳細を表示する
> pm2 show "hello"
Describing process with id 0 - name hello
┌───────────────────┬───────────────────────────────────────────────────┐
│ status            │ online                                            │
│ name              │ hello                                             │
│ node.js version   │ 4.0.0                                             │
│ id                │ 0                                                 │
│ path              │ C:\temp\hoge\app.js                               │
│ args              │ N/A                                               │
│ exec cwd          │ C:\temp\hoge                                      │
│ error log path    │ C:\Users\user\.pm2\logs\hello-error-0.log         │
│ out log path      │ C:\Users\user\.pm2\logs\hello-out-0.log           │
│ pid path          │ C:\Users\user\.pm2\pids\hello-0.pid               │
│ mode              │ fork_mode                                         │
│ node v8 arguments │ N/A                                               │
│ watch & reload    │ ✘                                                │
│ interpreter       │ node                                              │
│ restarts          │ 0                                                 │
│ unstable restarts │ 0                                                 │
│ uptime            │ 11s                                               │
│ created at        │ 2016-03-11T02:34:42.123Z                          │
└───────────────────┴───────────────────────────────────────────────────┘
  • プログラムをpm2のプロセスリストから除外する
> pm2 delete app1/app.js
[PM2] Deleting hello process
[PM2] deleteProcessId process id 0
  • pm2で監視されているアプリのログを表示する

これは、監視アプリ全てに対して、アプリケーションログをtail -f xxx.logと同等のことが可能。

> pm2 logs

特定のアプリだけのログをtailする場合は、

> pm2 logs <app name>
  • pm2本体を更新する(リストを全て削除される)
> npm install pm2@latest -g
> pm2 update
Be sure to have the latest version by doing `npm install pm2@latest -g` before doing this procedure.
[PM2] Stopping PM2...
[PM2] deleteProcessId process id 0
[PM2] All processes have been stopped and deleted
  • pm2本体を停止する
> pm2 kill
[PM2] Stopping PM2...
[PM2][WARN] No process found
[PM2] All processes have been stopped and deleted