Как сделать работу cron с PM2

Я хочу сделать задание cron для отправки почты каждые 15 минут, принимая данные из таблицы базы данных. В node js я могу выполнить задание cron, но через PM2 я не понимаю, где разместить код и как он работает.

Ответ 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 been 15 minutes!");

});

Ответ 2

Используйте параметр --cron:

-c --cron <cron_pattern>

Например:

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

Pm2 теперь перезапустит sendMail.js script в час, а через 15, 30 и 45 минут за час

Ответ 3

Если вы используете экосистему PM2, то в файле конфигурации добавьте последовательность cron к параметру script заключив ее в одинарные кавычки. Каким-то образом двойные кавычки не спомогли мне.

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
  }]
}

Ответ 4

Это то, что сработало для меня, я разделил cron в другой файл, который выполняется в другом процессе, потому что я хочу освободить ресурсы после того, как cron завершит выполнение.

ecosystem.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);
}

Ответ 5

Вы также можете использовать модуль 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.