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

这是一个更强大的解决方案,因为它涵盖了服务器重启的情况。