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

Posted

技术标签:

【中文标题】使用 Node-Cron 每 45 分钟运行一次 Cron 作业【英文标题】:Run Cron Job every 45 minutes with Node-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 分钟运行一次作业。 任何人都可以帮助我的模式? 谢谢:)

【问题讨论】:

【参考方案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 函数来检查它是否应该运行。

以上是关于使用 Node-Cron 每 45 分钟运行一次 Cron 作业的主要内容,如果未能解决你的问题,请参考以下文章

使用 Node-Cron 每 10 秒执行一次 Cron 作业

在实际服务器时间的每分钟的特定第二剩余时间运行代码

每分钟运行一次 cron 作业,但从特定时间开始

每 1 分钟显示一次通知 Android

crontab在特定时间之间每15分钟运行一次

CronJob只执行一次