节点 cron 作业执行重复

Node cron job executions duplicates

有两个机器人托管在 Ubuntu 服务器 18.04 x64(1 个核心)上并由 PM2(fork)支持。 https://dl4.joxi.net/drive/2020/01/07/0028/2950/1842054/54/ed0a34751d.jpg 其中之一计划使用 Cron 执行 运行 个任务,在示例中将是 - Quotes (MainBotDP)。

在 9 a.m。每天,执行一个脚本,该脚本应该发送一次报价(每天执行一次)。 相反,脚本 运行s 多次(并非总是)并发送多个引号。

我注意到一种模式,当我在白天多次重启机器人时似乎会发生这种情况,第二天脚本 运行s 取决于重启的次数(我不确定,我猜测)。我不太明白如何解决这种情况,我将不胜感激您的帮助!

PM2 配置文件

module.exports = {
  apps: [
    {
      name: "MainBotDP",
      cwd: "./digitalPilgrims/src/",
      script: "index.js",
      instance_var: "INSTANCE_ID",
      autorestart: true,
      watch: false,
      max_memory_restart: "1G",
      env: {
        WITH_SCHEDULE: "1"
      }
    },
    {
      name: "RSSNews",
      cwd: "./discordNews/",
      script: "server.js",
      instance_var: "INSTANCE_ID",
      autorestart: true,
      watch: false,
      max_memory_restart: "1G",
      env: {
        WITH_SCHEDULE: "2"
      }
    }
  ]
};

Cron 计划文件

const CronJob = require("cron").CronJob;
const { quoteOfDay } = require("./quote");
const { holidayNewYear } = require("./holidays");
const { monthlyGameStats } = require("./monthlyStats");

function startCrons(guild) {
  if (process.env.WITH_SCHEDULE === "1") {
    const cronQuote = new CronJob(
      "0 0 9 * * *",
      function() {
        quoteOfDay(guild);
      },
      false,
      false,
      "Europe/Moscow"
    );

    const cronHolidayNewYear = new CronJob({
      cronTime: "0 18 15 1 0 *",
      onTick: function() {
        holidayNewYear(guild);
      },
      start: false,
      timeZone: "Europe/Moscow"
    });

    const cronMonthlyGameStats = new CronJob(
      "0 10 1 * *",
      function() {
        monthlyGameStats(guild);
      },
      false,
      false,
      "Europe/Moscow"
    );
    cronQuote.start();
    cronHolidayNewYear.start();
    cronMonthlyGameStats.start();
  }
}

module.exports = {
  startCrons
};

不确定,但修改您的条件以检查当前实例是否为主实例,而不是配置额外信息...:[=​​11=]

if (parseInt(process.env.NODE_APP_INSTANCE) === 0
) {
    ... your code ...
}

问题是启动 Crons 的函数在 "process.on" 中是 运行。更改为 "process.once" 后,消息不再重复。