节点 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" 后,消息不再重复。
有两个机器人托管在 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" 后,消息不再重复。