【问题标题】:Schedule multiple cron jobs 24h apart on Node.js server在 Node.js 服务器上安排多个 cron 作业 24 小时分开
【发布时间】:2021-10-01 08:38:10
【问题描述】:

我目前有 3 个任务需要每 3 天执行一次,我希望它们之间的 24 小时错开,这样在给定的一天只有一个作业在以下时间表中运行:

第 1 天:工作 1

第 2 天:工作 2

第 3 天:工作 3

第 4 天:工作 1

第 5 天:工作 2

day6: job3 等等

这是我目前使用 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 知道在任何给定日历日应该运行哪个作业?

【问题讨论】:

    标签: javascript node.js cron schedule


    【解决方案1】:

    如果我要这样做,我的方法如下:

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

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

    【讨论】:

      最近更新 更多