2017-08-28 96 views

回答

2

两个cron作业:

00 1,6,11,16,21 * * * /command 
30 3,8,13,18,23 * * * /command 

或写在2.5小时后调用任务的脚本,并调用工作,你的脚本每隔5小时

+0

可能需要从OP中找出如何处理不均匀分配 - “23:30”和“01:00”之间只有1.5小时。 – paxdiablo

+0

是的。如果你需要不均匀的分配,写一个睡眠9000的2行bash脚本,这个工作会更好。 – Sam51

0

通常你可以用一个做到这一点很容易夫妇分开crontab条目,一个用于五个小时的工作,其他的在两者之间的工作:

0 0,5,10,15,20 ... 
30 2,7,12,17,22 ... 

牢记的是日之间的差距上一份工作一天,第二天的第一份工作只有一个半小时(2.5分不等于24分)。

如果你真的需要一两个和一个半小时的差距,你可以经常因为你需要,但只有执行负荷需要时所说的工作运行作业。

执行此操作的一种方法是使用状态文件来维护运行有效负载的最后时间,然后在一段合适的时间过后才运行有效负载。例如,该脚本只能运行有效载荷(最终echo)每7秒钟,不管多久脚本被称为:

#!/bin/bash 

# Configuration items. 

stateFile=/tmp/lastTime.txt # File holding time of last payload run. 
minGap=7     # How often payload should run (seconds). 

# Get last payload run time (with checks for non-valid data). 

((lastTime = 0)) 
[[ -f ${stateFile} ]] && lastTime="$(cat ${stateFile})" 
[[ "${lastTime}" =~ [1-9][0-9]* ]] || ((lastTime = 0)) 

# Exit if not enough time elapsed, else update last payload run time. 

thisTime=$(date +%s) 
((timeGap = thisTime - lastTime)) 
[[ ${timeGap} -lt ${minGap} ]] && exit 
echo ${thisTime} >${stateFile} 

# This is the payload section, put whatever code you want here. 

echo "[${lastTime}] [${thisTime}] [${timeGap}]" 

假设你叫这个脚本runme.sh,你可以测试一下:

while true ; do ./runme.sh ; sleep 1 ; done 

这将运行它的每一秒,但你会发现有效载荷仅每7秒钟(除第一次外)完成的,如预期:

[0] [1503908311] [1503908311] 
[1503908311] [1503908318] [7] 
[1503908318] [1503908325] [7] 
[1503908325] [1503908332] [7] 
[1503908332] [1503908339] [7] 
[1503908339] [1503908346] [7] 
[1503908346] [1503908353] [7] 

对于您的特定情况,您可以将minGap设置为9000(两个半小时,以秒为单位),并且cron根据的最大值运行脚本,该值等于间隔过去后您希望等待的时间量。

例如,假设您对潜伏五分钟的延迟感到满意(后续作业在前一作业之后的90到95分钟之间运行)。然后,您将设置cron,以便脚本每五分钟运行一次。

相关问题