如何用PM2做一个task job?
How to make a task job with PM2?
我想做一个 repeatable 作业,每 15 分钟发送一次邮件,从数据库 table 中获取数据。在节点 js 中,我可以创建作业,但通过 PM2,我不知道将代码放在哪里以及它是如何工作的。
使用--cron
选项:
-c --cron <cron_pattern>
例如:
pm2 start sendMail.js --cron "*/15 * * * *"
Pm2 现在将在整点、整点后 15、30 和 45 分钟重新启动 sendMail.js
脚本
感谢您的回答;我是这样做的,只需设置电子邮件
1.
npm install node-crontab
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!");
});
如果您使用 PM2 ecosystem,则在配置文件中将 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
}]
}
这对我有用,
我将 cron 拆分到不同的文件中,运行s 在不同的进程中,因为我想在 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 进程将 运行。
Key caveats:
无论何时执行 pm2 restart all,cron 作业都会 运行 而不管 cron 表达式如何。如果仅在特定时间对 运行 至关重要,请在 cron 文件的开头添加此附加检查
if (new Date().getHours() !== 0 ) {
console.log(`Current hours is ${new Date().getHours()}, not running.`)
process.exit(0);
}
您还可以使用 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风格的规则,不过我更喜欢上面的方式
查看文档
通过pm2实现cron的三种方式
- pm2 命令行
- pm2 ecosyste.config 文件
- pm2-api
refer this 这对我有帮助。
如果执行以下命令:
pm2 start handle-cron.js --cron "*/15 * * * *"
PM2 将启动您的 cron 作业,但它也会在完成后不断重启 cron-job。 --无限循环
您想将实例设置为 1 并设置不自动重启。
pm2 start handle-cron.js --no-autorestart --instances 1 --cron "0 * * * *"
我想做一个 repeatable 作业,每 15 分钟发送一次邮件,从数据库 table 中获取数据。在节点 js 中,我可以创建作业,但通过 PM2,我不知道将代码放在哪里以及它是如何工作的。
使用--cron
选项:
-c --cron
<cron_pattern>
例如:
pm2 start sendMail.js --cron "*/15 * * * *"
Pm2 现在将在整点、整点后 15、30 和 45 分钟重新启动 sendMail.js
脚本
感谢您的回答;我是这样做的,只需设置电子邮件
1.
npm install node-crontab
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!");
});
如果您使用 PM2 ecosystem,则在配置文件中将 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
}]
}
这对我有用, 我将 cron 拆分到不同的文件中,运行s 在不同的进程中,因为我想在 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 进程将 运行。
Key caveats:
无论何时执行 pm2 restart all,cron 作业都会 运行 而不管 cron 表达式如何。如果仅在特定时间对 运行 至关重要,请在 cron 文件的开头添加此附加检查
if (new Date().getHours() !== 0 ) {
console.log(`Current hours is ${new Date().getHours()}, not running.`)
process.exit(0);
}
您还可以使用 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风格的规则,不过我更喜欢上面的方式
查看文档通过pm2实现cron的三种方式
- pm2 命令行
- pm2 ecosyste.config 文件
- pm2-api
refer this 这对我有帮助。
如果执行以下命令:
pm2 start handle-cron.js --cron "*/15 * * * *"
PM2 将启动您的 cron 作业,但它也会在完成后不断重启 cron-job。 --无限循环
您想将实例设置为 1 并设置不自动重启。
pm2 start handle-cron.js --no-autorestart --instances 1 --cron "0 * * * *"