1. ホーム
  2. node.js

[解決済み] PM2を使ってアプリに実行引数を渡すには?

2023-05-04 13:39:50

質問

私は pm2 を使用していますが、引数を渡すことができません。私が使っているコマンドは pm2 start app.js -- dev . これはforeverで動作しますが。

どのように解決するのですか?

本チケットに記載されている方法で解決できます。 https://github.com/Unitech/pm2/issues/13

しかし、もし環境を渡すのであれば、環境変数の活用を検討したいかもしれません。この方法では、その環境内のどのプロセスからでもアクセスできる変数を process.env.* .

ということで、設定ファイル config.json :

{
   "dev": {
        "db": {
            "hosts":["localhost"],
            "database": "api"
        },
        "redis": {
            "hosts": ["localhost"]
        }
   },
   "staging": {
        "db": {
            "hosts":["1.1.1.1"],
            "database": "api"
        },
        "redis": {
            "hosts": ["2.2.2.2"]
        }
   },
   "production": {
        "db": {
            "hosts":["1.1.1.1", "1.1.1.2", "1.1.1.3"],
            "database": "api"
        },
        "redis": {
            "hosts": ["2.2.2.2", "2.2.2.3"]
        }
   }
}

そして、設定をインポートします。

var config=require('./config.json')[process.env.NODE_ENV || 'dev'];

db.connect(config.db.hosts, config.db.database);

そして、シェルを使って環境に変数を設定するのです。

export NODE_ENV=staging
pm2 start app.js

環境変数は、セッションと同じ時間だけ存続します。ですから、この環境変数を ~/.bashrc ファイルに設定する必要があります。これにより、セッションごとに変数が設定されます。

PM2 では デプロイメントシステム があり、アプリがデーモン化される前に毎回環境変数を設定することができます。POSIX システムのデーモンは一般的にこのようにパラメータを受け取りますが、これはパラメータがプロセスとともに失われないためです。あなたの状況を考えると、それはそれほど重要ではないかもしれませんが、良い習慣です。

さらに、実稼働時のダウンタイムを防ぐために、可能な限りローカルでの停止/起動、および再起動(クラスタモードの場合)を検討する必要があります。