如何使用PM2进行cron作业

Mil*_*ata 25 node.js pm2

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

Rob*_*bie 81

使用--cron选项:

-c --cron <cron_pattern>

例如:

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

Pm2现在将sendMail.js在一小时内重新启动脚本,并在一小时后的15,30 和45分钟重新启动脚本

  • 这应该是公认的解决方案. (9认同)
  • 脚本结束后,它会停止进程吗? (3认同)
  • @chrismarx 取决于您正在运行的脚本 - 如果它结束,则进程将停止,否则它将继续运行 - 请注意,这与 pm2 无关,它只是节点 (2认同)
  • 有没有办法把它放入pm2的配置文件? (2认同)
  • 配置文件有一个[cron_restart选项](http://pm2.keymetrics.io/docs/usage/application-declaration/),但重启**运行**应用程序.它似乎没有在cron计划上启动已终止的脚本.我认为正确的解决方案是在接受的答案中使用`cron-tab`,以及pm2中的`autorestart:true` (2认同)

Jas*_*son 15

如果执行以下命令:

pm2 start handle-cron.js --cron "*/15 * * * *"
Run Code Online (Sandbox Code Playgroud)

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

您希望将实例设置为 1 并设置不自动重启。

pm2 start handle-cron.js --no-autorestart --instances 1  --cron "0 * * * *"
Run Code Online (Sandbox Code Playgroud)


Ada*_*ela 10

如果您使用PM2 生态系统,则在配置文件中,script通过用单引号将cron序列添加到param中。不知何故,双引号对我不起作用。

module.exports = {
  apps : [{
    name        : "Send-mail",
    script      : "./sendMail.js --cron '*/15 * * * *'",
    watch       : true
  }]
}
Run Code Online (Sandbox Code Playgroud)

或者(我的偏好)

module.exports = {
  apps : [{
    name        : "Send-mail",
    script      : "./sendMail.js",
    cron_restart: "*/15 * * * *",
    watch       : true
  }]
}
Run Code Online (Sandbox Code Playgroud)


San*_*rde 9

这对我来说是有效的,我将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
    }
  ]
};
Run Code Online (Sandbox Code Playgroud)

以下行在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);
}
Run Code Online (Sandbox Code Playgroud)

  • @AntoniaBlair cronjob.js 是您想要定期运行的实际脚本本身。 (2认同)

Mil*_*ata -9

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

1.

npm install node-crontab
Run Code Online (Sandbox Code Playgroud)
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!");

});
Run Code Online (Sandbox Code Playgroud)

  • 这并不像OP最初要求的那样使用“pm2”。 (11认同)
  • @MilanMahata - 你知道这是“cron”而不是“corn”,对吗?:) - https://stackoverflow.com/posts/42501219/revisions (3认同)