2017-08-28 55 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,以便腳本每五分鐘運行一次。

相關問題