【问题标题】:Node cron job executions duplicates节点 cron 作业执行重复
【发布时间】:2020-04-24 20:37:39
【问题描述】:

有两个机器人托管在 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 点执行一个脚本,该脚本应发送一次报价(每天执行一次)。 相反,该脚本会运行多次(并非总是)并发送多个引号。

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

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
};

【问题讨论】:

    标签: javascript node.js cron discord.js pm2


    【解决方案1】:

    不确定,但在检查当前实例是否为主实例时修改您的条件,而不是配置额外信息...:

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

    【讨论】:

    • 您好,谢谢您的回答。当我使用您的代码时,不会检查 Cron 任务并且不会启动。我已经尝试过这些选项:if (parseInt(process.env.NODE_APP_INSTANCE) === 0)if (parseInt(process.env.NODE_APP_INSTANCE) === 9) – ID in the PM2 process 在 PM2 配置中还删除了 instance_var: "INSTANCE_ID"
    • 如果 id 存在,您可以查看控制台日志吗?
    • 当我 console.log 这个我得到未定义
    • 奇怪,你能看看这个链接和你的pm2版本吗,它应该让你感兴趣pm2.keymetrics.io/docs/usage/environment/…
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多