web-dev-qa-db-ja.com

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

データベーステーブルからデータを取得して、15分ごとにメールを送信するcronジョブを作成します。ノードjsではcronジョブを作成できますが、PM2を介してコードを配置する場所とその仕組みを理解できません。

21
Milan Mahata

ご回答ありがとうございます。このようにして、メールを設定するだけです

  1. npm install node-crontab

2. var crontab = require( 'node-crontab');

var jobId = crontab.scheduleJob( "*/15 * * * *"、function(){

//This will call this function every 15 minutes

console.log("It's been 15 minutes!");

});

0
Milan Mahata

--cronオプションを使用します。

-c --cron <cron_pattern>

例えば:

pm2 start sendMail.js --cron "*/15 * * * *"

Pm2は、今すぐsendMail.jsスクリプトを再起動し、1時間の15、30、45分に再起動します

78
Robbie

PM2 ecosystem を使用する場合、構成ファイルでscript paramにcronシーケンスを単一引用符でラップして追加します。どういうわけか二重引用符は私にとってうまくいきませんでした。

module.exports = {
  apps : [{
    name        : "Send-mail",
    script      : "./sendMail.js --cron '*/15 * * * *'",
    watch       : true
  }]
}

あるいは(私の好み)

module.exports = {
  apps : [{
    name        : "Send-mail",
    script      : "./sendMail.js",
    cron_restart: "*/15 * * * *",
    watch       : true
  }]
}
8
Adam Bubela

これは私のために働いたものです、cronが実行を完了した後にリソースを解放したいので、cronを別のプロセスで実行される別のファイルに分割します。

ecocosystem.config.js:

module.exports = {
  /**
   * Application configuration section
   * http://pm2.keymetrics.io/docs/usage/application-declaration/
   */
  apps: [

    // Main API Hosting
    {
      name: 'API',
      script: 'bin/www',
      env: {
        COMMON_VARIABLE: 'true'
      },
      instances: 1,
      exec_mode: 'cluster',
      watch: false,
      autorestart: true
    },
    {
      name: 'CRON',
      script: "crons/cronjob.js",
      instances: 1,
      exec_mode: 'fork',
      cron_restart: "0,30 * * * *",
      watch: false,
      autorestart: false
    }
  ]
};

Cron実行可能ファイルでは次の行が重要です

cron_restart: "0,30 * * * *" <-cron式

autorestart: false <-重要です。そうでない場合、pm2は完了後すぐにcronを再起動します

また、instancesが1であることを確認してください。そうでない場合、複数のcronプロセスが実行されます。

重要な注意事項:

Pm2をすべて再起動するたびに、cronジョブはcron式に関係なく実行されます。特定の時間にのみ実行することが重要な場合は、cronファイルの先頭にこの追加チェックを追加します

if (new Date().getHours() !== 0 ) {
  console.log(`Current hours is ${new Date().getHours()}, not running.`)
  process.exit(0);
}
6
Sanket Berde

Node-scheduleモジュールを使用して、cronスタイルのルールを定義することもできます。その後、pm2でプログラムを通常どおり実行できます。多くのプロジェクトでPM2でこれを使用しますが、決して私を失望させませんでした。

var schedule = require('node-schedule');

var rule = new schedule.RecurrenceRule();
rule.hour = [10]; // 10am
rule.minute = [0]; // 0mins

var job = schedule.scheduleJob(rule, function(){
    console.log("10am every day")
});         

//Rule 2 - 6am every wednesday
var rule2 = new schedule.RecurrenceRule();
rule2.dayOfWeek = 3; // 0 = Sunday
rule2.hour = 6;
rule2.minute = 0;

var job2 = schedule.scheduleJob(rule2, function(){
    console.log("Every Wednesday @ 6am");
});


var rule3 = new schedule.RecurrenceRule();
rule3.minute = [0, 15, 30, 45]; // Specific Minutes

var job3 = schedule.scheduleJob(rule3, function(){
    console.log("Run at specific minutes")
});         

CRONスタイルのルールもサポートしていますが、上記の方法の方が好きです。

https://www.npmjs.com/package/node-schedule のドキュメントをご覧ください

1
Dan Watts