使用Node-Cron每45分钟运行一次Cron Job

时间:2014-06-17 09:40:48

标签: node.js cron

我正在使用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分钟运行一次。 任何人都可以帮我解决这个模式吗? 谢谢:))

9 个答案:

答案 0 :(得分:41)

您可能正在寻找

0 */45 * * * *

范围为here

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

答案 1 :(得分:14)

我对cron比对node-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以建议编写此函数的最佳方法,但它应该相当简单。

或写入28行以指定您希望它运行的所有时间。

答案 2 :(得分:2)

没有直接的方式来执行此操作。但是,我们可以通过在目标脚本中使用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;

答案 3 :(得分:1)

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

命令date +%M在shell脚本中可能会有所帮助。

答案 4 :(得分:1)

我已经尝试了45秒的间隔并且工作正常

&#39; * / 45 * * * * *&#39;

答案 5 :(得分:1)

您可以使用node-reel,它更具可读性,直截了当且很棒。

const reel = require('node-reel')

reel().call(() => {
    console.log(Date.now());
}).everyFortyFiveMinutes().run()

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

答案 6 :(得分:0)

使用cron npm moduel这样的东西

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();

答案 7 :(得分:0)

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

答案 8 :(得分:0)

答案: */45 * * * *

这将每45分钟运行


看看这里有清楚的了解?

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