NodeJS pm2 cron在启动时自动运行

1sbrub3j  于 2023-08-04  发布在  Node.js
关注(0)|答案(2)|浏览(183)

我正在尝试使用pm2在午夜运行cron。
在这个设置中,我遇到了一个意想不到的场景,在这个场景中,只要我启动这个进程,cron就会被触发一次。

有没有一种方法可以配置它,而不必在cron进程中验证运行时间?

ecosystem.config.js

module.exports = {
  apps: [
    {
      name: "server",
      script: "server.js",
      watch: false,
      env: {
        NODE_ENV: "production"
      }
    },
    {
      name: "test-cron",
      script: "test-cron.js",
      instances: 1,
      exec_mode: "fork",
      cron_restart: "0 0 * * *",
      watch: false,
      autorestart: false,
      env: {
        NODE_ENV: "production"
      }
    }
  ]
};

字符串
命令

pm2-runtime ecosystem.config.js


test-cron.js

console.log("CRON EXECUTED");


控制台输出:

> pm2-test@1.0.0 start /Users/sudhirshrestha/workspace/pm2-test
> pm2-runtime ecosystem.config.js

2019-08-28T22:54:44: PM2 log: Launching in no daemon mode
2019-08-28T22:54:44: PM2 log: App [server:0] starting in -fork mode-
2019-08-28T22:54:44: PM2 log: App [test-cron:1] starting in -fork mode-
2019-08-28T22:54:44: PM2 log: App [server:0] online
2019-08-28T22:54:44: PM2 log: App [test-cron:1] online
CRON EXECUTED
2019-08-28T22:54:49: PM2 log: App [test-cron:1] exited with code [0] via signal [SIGINT]


问题:启动时Cron自动运行一次

57hvy0tb

57hvy0tb1#

正如pm2文档所说,“应用程序必须运行cron功能才能工作”,所以当然,当你启动它时,你的东西会运行一次。https://pm2.keymetrics.io/docs/usage/application-declaration/#control-flow
该功能旨在重新启动已经运行的程序,而不是定期运行现在未运行的程序。PM2是关于管理长时间运行的流程。这不是周期性地启动一个小的短期运行程序。对于您想要的,为什么不使用常规的cron作业呢?

kr98yfug

kr98yfug2#

它没有文档记录,但基于ENV变量,有办法知道脚本是启动还是重新启动。

  • 它没有prev_restart_delay
  • 它有restart_time: '0'(虽然不幸的是,如果你停止脚本,它将再次以'0'开始)

因此,在test-cron.js中,您可以添加以下内容:

if (!process.env.prev_restart_delay) {
    process.exit(0);
  }

字符串
这将停止你的脚本,但它仍然会重新启动cron定义,这个条件将被跳过。
我还注意到pm2在重启后添加了ENV变量'exit_code': '0',所以你也可以使用这个替代条件:

if (!process.env.exit_code) {
  process.exit(0);
}

相关问题