PM2のアプリケーションルートの設定

関連投稿
pm2によるプロセス管理

少し前まで、node.jsプログラムのカレントディレクトリが、起動方法によって変わってしまう問題で悩んでいた件、一応の解決方法が見つかったのでメモしておく。

コンソールからアプリを実行した場合、app_dirがカレントディレクトリとして動作する。

> cd app_dir
> node app.js
:

上記のアプリをpm2へ登録および実行した場合、app_dirではなく、その一つ上のディレクトリがカレントになっており、プログラム内でフォルダやファイルの読み込みでことごとく失敗していた。

> cd app_dir
> pm2 start app.js --name="hoge"

pm2でもコンソールから起動した時と同じディレクトリをルートとして起動できないか、調べていたら以下(といっても2014年なのですごい前)でも議論されていたよう。
Support a cwd option in JSON files #295

pm2 startでアプリを登録する場合、jsonファイルを使うこともできるらしく、そのプロパティcwdで起動時のカレントを指定できる。

{
  "name": "hoge app",
  "script": "app.js",
  "cwd": "/home/hoge/"
}

最低限必要なパラメータのみだと上記になる。(ほかにもかなりたくさんのパラメータ指定できる)
上記のjsonファイルを使ってPM2に登録すると、プログラム内でprocess.cwd()を実行すると、上記のパスが返るようになる。

> pm2 start app.json

混同しやすいが、

  • __dirname : 実行するスクリプトのディレクトリパス
  • process.cwd() : アプリケーションのカレントディレクトリ

と覚えておく。