PM2でCronジョブを作成する方法

PM2を使用したアプリケーションでインスタンスを複数起動している場合、Node CronNode Scheduleを利用してCronジョブを作成すると一度にインスタンスの数だけ実行されてしまいます。

この場合別パッケージを使用するのではなく、PM2にデフォルトで備わっているCron機能を使うとCron専用のインスタンスが立ち上がり1度に1回のみ実行することが可能になります。

使い方

CLIの場合

--cron-restartオプションで実行する時間を指定します。
下記は10分毎にapp.jsを実行するコマンドです。


pm2 start app.js --cron-restart="*/10 * * * *"

設定ファイルを使う場合

nameに任意のアプリ名、scriptに実行したいファイルのパス、instances1cron_restartに実行する時間、exec_modeforkを指定します。


/* 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);
}

参考