at backyard

Color my life with the chaos of trouble.

PM2でError: Cannot find moduleのエラーで落ちるときの対応手順

前提

サーバのプロセス管理に PM2 を使うことにした。

github.com

依然触ったことのあるツールだったが、もう何年も触っていなかったので素振りとしてプロジェクトにインストールして動かしていた (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 ディレクトリの存在をチェックしていたのかと思われる。

これで問題は解決した。

最初にも書いたが、ソースコードは読んでいないので、ここに書いた挙動についてはすべて想像です。

後でソースコードも読んでみようと思う。