PM2を使用したアプリケーションでインスタンスを複数起動している場合、Node CronやNode Scheduleを利用してCronジョブを作成すると一度にインスタンスの数だけ実行されてしまいます。
この場合別パッケージを使用するのではなく、PM2にデフォルトで備わっているCron機能を使うとCron専用のインスタンスが立ち上がり1度に1回のみ実行することが可能になります。
使い方
CLIの場合
--cron-restart
オプションで実行する時間を指定します。
下記は10分毎にapp.jsを実行するコマンドです。
pm2 start app.js --cron-restart="*/10 * * * *"
設定ファイルを使う場合
name
に任意のアプリ名、script
に実行したいファイルのパス、instances
に1
、cron_restart
に実行する時間、exec_mode
にfork
を指定します。
/* ecosystem.config.js */
module.exports = {
apps: [
{
name: 'Cron',
script: 'cron.js',
instances: 1,
cron_restart: '*/10 * * * *',
exec_mode: 'fork',
},
],
};
起動は設定ファイルを指定して、--only
オプションでアプリ名を指定します。
pm2 start ecosystem.config.js --only Cron
注意点
コードを変更してpm2 reload
等のコマンドで再起動した場合、cron_restart
で指定した時間に関わらずファイルが実行されてしまいます。
これを防ぐには下記のように実行ファイル側でも時間をチェックする必要があります。cron_restart
で指定した時間と同じ時間に実行されるようにチェックすると良いでしょう。
// 分が10の倍数以外の場合処理を停止する
if (new Date().getMinutes() % 10 !== 0) {
process.exit(0);
}