Я хочу сделать задание cron для отправки почты каждые 15 минут, принимая данные из таблицы базы данных. В node js я могу выполнить задание cron, но через PM2 я не понимаю, где разместить код и как он работает.
Как сделать работу 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.