我想做一个cron作业,每15分钟发送一次从数据库表中获取数据的邮件。在节点js中,我可以创建一个cron作业但是通过PM2,我不知道在哪里放置代码以及它是如何工作的。
使用--cron
选项:
-c --cron
<cron_pattern>
例如:
pm2 start sendMail.js --cron "*/15 * * * *"
Pm2现在将在一小时内重新启动sendMail.js
脚本,并在每小时的15,30和45分钟重新启动
这对我有用,我将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 * * * *"
autorestart: false
还要确保你的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);
}
如果你使用PM2 ecosystem然后在配置文件中通过用单引号包装cron序列将qron序列添加到script
param。不知何故双引号对我不起作用。
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
}]
}
您还可以使用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样式规则,但我更喜欢上述方法。
谢谢您的回答;我这样做,只是设置电子邮件
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!");
});