PM2でError: Cannot find moduleのエラーで落ちるときの対応手順
前提
サーバのプロセス管理に PM2
を使うことにした。
依然触ったことのあるツールだったが、もう何年も触っていなかったので素振りとしてプロジェクトにインストールして動かしていた (yarn add pm2
して動かしていたということ)。
素振り期間も終わったので、改めてglobelにインストールし直して、pm2 start app.js
で動かしたのだが、その後 pm2 list
するとエラーで落ちている。
そのエラーの内容が Error: Cannot find module
で、しかもプロジェクト内のnode_modules内配下にインストールしたPM2を見に行っているというものだった。
(すでにこの時点では node_modules
内は一度きれいにしており、 package.json
にも依存関係は記載していないし、ソースコード内にも当然上のエラーに関連しているような箇所はない。そのためpm2がnode_modules配下に見に行っているというのは何かがおかしい...)
注意点
この対応策は自分一人で運営している環境で実践しているものです。
複数のサービスが動くようなサーバ上で実践すると事故に繋がりかねないので、その点お気をつけください。
(というか、たぶんそういう環境であればはじめから PM2
をglobalインストールして使っていると思うので、今回のような事象は起きないと思いますが)
解決策
PM2
のソースコードを読んでいないので、半分自分の想像で書いていく。
PM2
はユーザのホームディレクトリに自身のディレクトリを作っており、おそらくここに以前プロジェクトに直接インストールして使っていた際の情報が残っているように思われた。
そのためまずはその .pm2
というディレクトリをすべて削除
rm -rf ~/.pm2/
次に自身のプロジェクトルートに移動し、node_modules
を削除
rm -rf node_modules
そしていま一度 npm install
を行い、
npm install --production
global側にpm2のインストールも行う。
npm install pm2 -g
最後にPM2を用いて実行する。
pm2 start app.js
pm2
を実施したタイミングで、初めてPM2
を起動したときのようなウェルカムメッセージっぽいのが出たので、やはりおそらくはホームディレクトリの .pm2
ディレクトリの存在をチェックしていたのかと思われる。
これで問題は解決した。
最初にも書いたが、ソースコードは読んでいないので、ここに書いた挙動についてはすべて想像です。
後でソースコードも読んでみようと思う。