在 Node.js 服务器上每隔 24 小时安排多个 cron 作业
Schedule multiple cron jobs 24h apart on Node.js server
我目前有 3 个任务需要每 3 天执行一次,我希望它们之间间隔 24 小时,这样在给定的一天只有一个任务 运行s 用于以下时间表:
第 1 天:工作 1
第 2 天:工作 2
第 3 天:工作 3
第 4 天:工作 1
第 5 天:工作 2
第 6 天:工作 3 等等
这是我目前使用 24 小时超时来错开作业的(笨拙的)方法
import cron from 'node-cron'
cron.schedule('0 0 12 */3 * *', () => {
console.log('run job 1')
})
setTimeout(() => {
cron.schedule('0 0 12 */3 * *', () => {
console.log('run job 2')
})
setTimeout(() => {
cron.schedule('0 0 12 */3 * *', () => {
console.log('run job 3')
})
}, 24 * 3600 * 1000)
}, 24 * 3600 * 1000)
这似乎非常不稳定,每次服务器中断或必须重新启动时,时间都会搞砸。
有没有办法告诉 cron 多个作业之间的时间,以便它们自动间隔 24 小时,以便 cron 知道哪个作业应该 运行 在任何给定的日历日?
如果我要这样做,我的做法是:
import cron from 'node-cron';
let currentJob = 0;
cron.schedule('0 0 12 * * *', () => {
const jobs = [ job1, job2, job3 ];
jobs[currentJob]();
currentJob = (currentJob + 1) % 3;
});
这样,每天 运行 一份新工作。
但这有一个含义,每当服务器重新启动或中断时,无论最后一个任务是 运行,第一个任务是 运行。如果执行任务的顺序很重要,这是一种不受欢迎的行为,我怀疑确实如此。然后,您将需要以某种方式保留值 currentJob
,以便它不会重置为零。这样的东西应该足够了:
import cron from 'node-cron';
import fs from "fs";
cron.schedule('0 0 12 * * *', () => {
const jobs = [ job1, job2, job3 ];
currentJob = getCurrentJobValue();
jobs[currentJob]();
setCurrentJobValue(currentJob + 1);
});
const FILE_NAME = "currentJob.json";
function getCurrentJobValue() {
if (!fs.existsSync(FILE_NAME)) {
fs.writeFileSync(FILE_NAME, JSON.stringify({
currentJob: 0
}));
return 0;
}
let data = fs.readFileSync(FILE_NAME);
return JSON.parse(data).currentJob;
}
function setCurrentJobValue(value) {
var data = fs.readFileSync(FILE_NAME);
fs.writeFileSync(FILE_NAME, JSON.stringify({
currentJob: value % 3
}));
return value % 3;
}
这是一个更强大的解决方案,因为它涵盖了服务器重启的情况。
我目前有 3 个任务需要每 3 天执行一次,我希望它们之间间隔 24 小时,这样在给定的一天只有一个任务 运行s 用于以下时间表:
第 1 天:工作 1
第 2 天:工作 2
第 3 天:工作 3
第 4 天:工作 1
第 5 天:工作 2
第 6 天:工作 3 等等
这是我目前使用 24 小时超时来错开作业的(笨拙的)方法
import cron from 'node-cron'
cron.schedule('0 0 12 */3 * *', () => {
console.log('run job 1')
})
setTimeout(() => {
cron.schedule('0 0 12 */3 * *', () => {
console.log('run job 2')
})
setTimeout(() => {
cron.schedule('0 0 12 */3 * *', () => {
console.log('run job 3')
})
}, 24 * 3600 * 1000)
}, 24 * 3600 * 1000)
这似乎非常不稳定,每次服务器中断或必须重新启动时,时间都会搞砸。
有没有办法告诉 cron 多个作业之间的时间,以便它们自动间隔 24 小时,以便 cron 知道哪个作业应该 运行 在任何给定的日历日?
如果我要这样做,我的做法是:
import cron from 'node-cron';
let currentJob = 0;
cron.schedule('0 0 12 * * *', () => {
const jobs = [ job1, job2, job3 ];
jobs[currentJob]();
currentJob = (currentJob + 1) % 3;
});
这样,每天 运行 一份新工作。
但这有一个含义,每当服务器重新启动或中断时,无论最后一个任务是 运行,第一个任务是 运行。如果执行任务的顺序很重要,这是一种不受欢迎的行为,我怀疑确实如此。然后,您将需要以某种方式保留值 currentJob
,以便它不会重置为零。这样的东西应该足够了:
import cron from 'node-cron';
import fs from "fs";
cron.schedule('0 0 12 * * *', () => {
const jobs = [ job1, job2, job3 ];
currentJob = getCurrentJobValue();
jobs[currentJob]();
setCurrentJobValue(currentJob + 1);
});
const FILE_NAME = "currentJob.json";
function getCurrentJobValue() {
if (!fs.existsSync(FILE_NAME)) {
fs.writeFileSync(FILE_NAME, JSON.stringify({
currentJob: 0
}));
return 0;
}
let data = fs.readFileSync(FILE_NAME);
return JSON.parse(data).currentJob;
}
function setCurrentJobValue(value) {
var data = fs.readFileSync(FILE_NAME);
fs.writeFileSync(FILE_NAME, JSON.stringify({
currentJob: value % 3
}));
return value % 3;
}
这是一个更强大的解决方案,因为它涵盖了服务器重启的情况。