【问题标题】:Run Cron Job every 45 minutes with Node-Cron使用 Node-Cron 每 45 分钟运行一次 Cron 作业
【发布时间】:2014-08-07 06:26:04
【问题描述】:

我正在使用 node-cron 来运行预定的作业。 我希望作业每 45 分钟运行一次,但它的行为很奇怪

这是我正在使用的模式

'00 */45 * * * *'

我的脚本开始于 Tue Jun 17 2014 08:17:39 GMT+0000 (GMT)

这是作业执行的前几次

1. Tue Jun 17 2014 08:45:03 GMT+0000 (GMT)

2. Tue Jun 17 2014 09:00:01 GMT+0000 (GMT)

3. Tue Jun 17 2014 09:45:02 GMT+0000 (GMT)

这绝对不是我所期望或想要的。 我想要的只是每 45 分钟运行一次作业。 任何人都可以帮助我的模式? 谢谢:)

【问题讨论】:

    标签: node.js cron


    【解决方案1】:

    就在最近 (27|01|22) 在我的项目中使用了 Node Cron

    const TaskSchedulerTimeInterval = 45;
    
    // Runs a job for every 45 mins asynchronously
    const fetchYoutubeAPIScheduler = () => {
        try {
            nodeCron.schedule(`*/${TaskSchedulerTimeInterval} * * * *`, async () => {
                console.log('Running');
            })
        } catch (error) {
            console.log('error =', error);
        }
    };
    

    基本含义(喜欢其他人的解释,因此在一篇文章中将它们一起引用):

    #sec min hour monthday month weekday
    */15  *    *     *       *       *  
    
    

    以上示例每 15 秒运行一次

    每个字段的范围:

    Sec: 0-59
    Min: 0-59
    Hour: 0-23
    monthday(Day of Month): 1-31
    Months: 0-11
    weekDay(Day of Week): 0-6
    

    【讨论】:

    • 一个好的答案将始终包括解释为什么这会解决问题,以便 OP 和任何未来的读者可以从中学习。
    • 感谢您告诉我!我现在添加了解释@Tyler2P。
    【解决方案2】:

    回答: */45 * * * *

    这将每 45 分钟运行一次


    看这里以获得清晰的理解?

    https://crontab.guru/#/45_*_

    【讨论】:

      【解决方案3】:

      相比node-cron,我更熟悉 cron,但我快速浏览了文档。

      如果我理解正确的话,node-cron 使用的语法类似于 cron 使用的语法,但多了一个“秒”字段。那么 cron 作业可能在哪里:

      # min hour mday month wday command
      */15  *    *    *     *    some-command
      

      要安排 some-command 每 15 分钟运行一次,node-cron 将使用类似的语法来指定运行时间:

      '0 */15 * * * *'
      

      (带有指定秒数的附加字段),但它执行指定的 JavaScript 函数,而不是外部命令。

      在标准 cron 中,没有指定每 45 分钟运行一次作业的语法。 0/45 * * * * 的规范将每小时运行两次作业,分别在整点后的 0 分钟和 45 分钟。要每 45 分钟运行一次作业(在 00:00、00:45、01:30、02:15,...,即每天 32 次),您必须安排它每 15 分钟运行一次,并且然后调用一个检查当前时间的脚本来决定是否做任何事情。

      或者您可以写一份详尽的列表,列出您希望作业运行的所有时间:

       0  0 * * * some-command
      45  0 * * * some_command
      30  1 * * * some_command
      15  2 * * * some_command
      # 28 lines omitted
      

      我肯定想写一个脚本来生成这个列表。

      (这是可行的,因为 24 小时恰好是 45 分钟的倍数。 你不能以这种方式每 35 分钟运行一次。)

      类似的方法应该适用于 node-cron。安排函数每 15 分钟运行一次,并调用一个检查当前时间的函数来决定是否运行。例如,您可以检查从午夜开始的分钟数模 45 是否为零。 (如果计划不准确,您可能希望允许有一个小的差异。)

      我对 JavaScript 的了解不够,无法建议编写此函数的最佳方法,但它应该相当简单。

      或者写 32 行来指定你希望它运行的所有时间。

      【讨论】:

        【解决方案4】:

        我尝试了这个字符串 45 秒的时间间隔,效果很好:

        '*/45 * * * * *'
        

        【讨论】:

        • 是吗?我希望它每分钟运行两次,每分钟运行 0 秒和 45 秒(交替 45 秒和 15 秒间隔)。
        【解决方案5】:

        你可以使用node-reel,它更易读、更直接、更棒?。

        const reel = require('node-reel')
        
        reel().call(() => {
            console.log(Date.now());
        }).everyFortyFiveMinutes().run()
        

        https://github.com/shakee93/node-reel

        【讨论】:

          【解决方案6】:

          您可以参考cronr,它支持所有的宏模式并提供在线演示cronr -- online demo

          【讨论】:

            【解决方案7】:

            使用类似这样的 cron npm 模块

            var cronJob = require('cron').CronJob;  
            var job = new cronJob({ 
                cronTime:'0 */45 * * * *', 
                onTick: function(){
                    var my_date = new Date();
                    var tomorrow_date = my_date.getFullYear() + "-" + ('0'+(my_date.getMonth()+1)) + "-" + (my_date.getDate()+1)
                    var condition = [{},{$set: {'plannedDeliveryDate' :tomorrow_date +'T00:00:00.000Z'}}]
                    dbQuery.updateMany(orderModel, condition, function(err, result){
                        if(result.nModified == result.n) console.log(err, result)
                    })
                },
                start:true,
                timeZone:'Asia/Kolkata'
            });
            job.start();
            

            【讨论】:

              【解决方案8】:

              没有直接的方法可以做到这一点。但是,我们可以通过在目标脚本中使用 shell 命令拦截调度来获得结果。

              首先,每 15 分钟运行一次脚本:

              */15 * * * * <target_script>
              

              然后,在 target_script 中,将以下代码放在实际代码之前:

              #!/bin/sh
              
              # Exit except at 0:45, 1:30, 2:15, 3:00, 3:45 etc
              
              if ! echo "((`date +%-H`*60)+`date +%-M`)/45" | bc -l | grep "\.0*$" &> /dev/null;
              then exit 1;
              fi
              
              # Your actual code goes here;
              

              【讨论】:

                【解决方案9】:

                你可能正在寻找

                0 */45 * * * *
                

                范围是here

                • 秒:0-59
                • 分钟:0-59
                • 营业时间:0-23
                • 月份的日期:1-31
                • 月数:0-11
                • 星期几:0-6

                【讨论】:

                • 不是“每 45 分钟”而是“每小时 45”。
                • 对此进行了测试,但它似乎也每秒运行一次,这是有道理的,因为第一个 * 当从 17:50:18 开始时,它运行在 18:00:01 18:00:02 等我要去尝试 00 代替第一个 *
                • 通过对秒字段稍作调整使其工作,这是模式; 0 */45 * * * *
                • @elimence:我从未使用过node-cron,但它似乎是为了与 cron 兼容,并添加了一个“秒”列。 0 */45 * * * * 真的每 45 分钟运行一次工作吗?我希望它每小时运行两次,分别在整点后的 0 分钟和 45 分钟(08:00、08:45、09:00、09:45、10:00、10:45……)。
                • @elimence:考虑一下接受您实际提出的问题的答案是否更公平,而不是与您非常明确地说没有 满足您的要求。改变你对你想做的事情的想法并没有错,但我们不是读心术的人。 (顺便说一句,每 30 分钟运行一次命令是否符合您修改后的要求?)
                【解决方案10】:

                您需要编写一个脚本作为包装器来决定是否每 45 分钟执行一次实际命令。即 0、45、30 (= 45 + 45 - 60)、15 (= 30 + 45 - 60)、0 (= 15 + 45 - 60)。因此,运行脚本的分钟数应为0,15,30,45

                date +%M 命令可能对 shell 脚本有帮助。

                【讨论】:

                • 我正在使用一个名为 node-cron 的库,它所需要的只是正确的 cron 模式。我不认为我可以编写脚本来使用它,如果可能的话,那么我不知道该怎么做。这是一个链接github.com/ncb000gt/node-cron
                • 对不起,我不使用 node-cron。从来没有听说过。上面的方法是针对cron的。也许 node-cron 有一些 cron 没有的额外语法。我遇到了类似的问题,并且已经阅读了 crontab 的手册。我认为 cron 不可能执行“每两周”或“每 45 分钟”之类的操作。因此,编写一个脚本作为包装器来检查是否运行似乎是唯一的选择。
                • 我认为您的想法可能是正确的。但是由于node-cron 安排的是 JavaScript 代码的执行,而不是命令,所以 OP 需要编写一个 JavaScript 函数来检查它是否应该运行。
                猜你喜欢
                • 2013-11-27
                • 1970-01-01
                • 1970-01-01
                • 2017-10-15
                • 1970-01-01
                • 2015-07-29
                • 1970-01-01
                • 2020-02-23
                • 2018-02-18
                相关资源
                最近更新 更多