pm2 cron 在启动时自动运行

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

我正在尝试使用 pm2 在午夜运行 cron。

通过这种设置,我面临着一个意想不到的情况,一旦我启动进程,cron 就会被触发一次。

有没有一种方法可以配置此功能,而无需在 cron 进程中验证运行时间?

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

测试-cron.js

console.log("CRON EXECUTED");

控制台输出:

> [email protected] 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 在启动时立即自动运行一次

javascript node.js cron pm2
2个回答
2
投票

正如 pm2 文档所说,“应用程序必须运行才能使 cron 功能发挥作用”,所以当然,当你启动它时,你的东西就会运行一次。 https://pm2.keymetrics.io/docs/usage/application-declaration/#control-flow

该功能旨在重新启动已运行的程序,而不是定期运行现在未运行的程序。 PM2 是关于管理长时间运行的流程。这并不是定期启动一个短期运行的小程序。对于你想要的,为什么不直接使用常规的 cron 作业呢?


0
投票

没有记录,但根据 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);
}

更新 04/25/2024:

目前此功能有一个开放的 PR,因此希望在 PR 合并后能够有一个选项来处理它:

https://github.com/Unitech/pm2/pull/5782

© www.soinside.com 2019 - 2024. All rights reserved.