Node cron дублирует выполнение заданий - PullRequest
0 голосов
/ 07 января 2020

Есть два бота, которые размещены на сервере Ubuntu 18.04 x64 (1 ядро) и поддерживаются PM2 (fork). https://dl4.joxi.net/drive/2020/01/07/0028/2950/1842054/54/ed0a34751d.jpg Один из них запланирован для запуска задач с использованием Cron , в примере будет - Котировки (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
};

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Проблема заключалась в том, что функция, запускающая Crons, работала в "process.on". После изменения на «process.once» сообщения больше не дублируются.

0 голосов
/ 07 января 2020

Не уверен, но измените ваше состояние, проверяя, является ли текущий экземпляр основным, вместо настройки дополнительной информации ...:

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