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