每隔45分钟使用Node-Cron运行Cron作业
我正在使用node-cron来运行预定作业。 我希望这些工作每45分钟运行一次,但是它的performance很奇怪
这是我正在使用的模式
'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 */45 * * * *
范围在这里 。
- 秒:0-59
- 分钟:0-59
- 时间:0-23
- 本月的一天:1-31
- 月份:0-11
- 星期几:0-6
我比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分钟运行一次,然后调用一个检查当前时间的脚本来决定是否执行任何操作。
类似的方法应该适用于node-cron。 安排函数每15分钟运行一次,并调用一个检查当前时间的函数来决定是否运行。 例如,您可以检查自午夜以来模45的分钟数是否为零。 (如果日程安排不准确,您可能要考虑一个小的变化。)
我不太了解JavaScript以提供编写此函数的最佳方法,但它应该是相当简单的。
您需要编写一个脚本作为包装来决定是否每45分钟执行一次实际的命令。 那是0,45,30(= 45 + 45-60),15(= 30 + 45-60),0(= 15 + 45-60)。 所以,脚本的运行时间为0,15,30,45
。
命令date +%M
可能对shell脚本有帮助。
没有直接的方法来做到这一点。 但是,我们可以通过在目标脚本中使用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;
使用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();
试试这个,
0-23/45 * * * *