如何用PM2做任务作业?

问题描述 投票:0回答:8

我想做一个可重复的工作,每 15 分钟发送一次邮件,从数据库表中获取数据。在节点 js 中,我可以创建作业,但通过 PM2,我不知道将代码放在哪里以及它是如何工作的。

pm2
8个回答
121
投票

使用

--cron
选项:

-c --cron

<cron_pattern>

例如:

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

Pm2 现在将在整点、整点后 15、30 和 45 分钟重新启动

sendMail.js
脚本


34
投票

这对我有用, 我将 cron 拆分在一个不同的文件中,该文件在不同的进程中运行,因为我想在 cron 完成执行后释放资源。

生态系统.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 expression

autorestart: false
<- important because otherwise pm2 will restart the cron after completion immediately

还要确保您的

instances
为 1,否则将运行多个 cron 进程。

关键注意事项:

无论何时执行 pm2 restart all,cron 作业都会运行,而不管 cron 表达式如何。如果仅在特定时间运行至关重要,请在 cron 文件的开头添加此附加检查

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

20
投票

如果您使用 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
  }]
}

12
投票

如果执行以下命令:

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

PM2 将启动您的 cron 作业,但它也会在完成后不断重启 cron-job。 --无限循环

您想将实例设置为1并设置no-autorestart。

pm2 start handle-cron.js --no-autorestart --instances 1  --cron "0 * * * *"

4
投票

您还可以使用 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


0
投票

我通常将 pm2 与 unix crontab 一起使用,它允许我使用 unix 本身控制 cron,并能够使用 pm2 日志,我发现这对我很有用。

0 * * * * /usr/bin/pm2 start /var/www/app/cron/index.js --name cron_app

但这是我的情况,对于 pm2 cron,我更喜欢上面的答案,只是从未使用过它,因为如果可以直接通过 OS crontab 启动它,我不喜欢依赖 pm2 进行 cronjobs。


-2
投票

通过pm2实现cron的三种方式

  1. pm2 命令行
  2. pm2 ecosyste.config 文件
  3. pm2-api

参考这个这对我有帮助。


-8
投票

谢谢您的回答;我是这样做的,只需设置电子邮件

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!");

});
© www.soinside.com 2019 - 2024. All rights reserved.