使用 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 作业的主要内容,如果未能解决你的问题,请参考以下文章