2017-08-28 3 views

答えて

2

二つのcronジョブ:

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

または5時間ごと

+0

OPから、不均等分布をどうするかを決める必要があります。「23:30」と「01:00」の間に1.5時間しかありません。 – paxdiablo

+0

はい。不均等な配布が必要な場合は、スリープ9000で2行のbashスクリプトを作成し、そのジョブはより良い方法です。 – Sam51

0

を2.5時間後に仕事を呼び出すスクリプトを書き、仕事と自分のスクリプトを呼び出しますが、一般的に非常に簡単にこれを行うことができます心の中で

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

保管その目の間のギャップ:別のcrontabエントリ、5時間のジョブの1つに-間の雇用のための他のカップル1日の最後の仕事と翌日の最初の仕事はわずか1時間半です(2.5は24に均等に分けられません)。必要なときに

あなた本当には2時間半のギャップが必要な場合は、できるだけ頻繁にあなたがする必要があるとして、あなたの仕事を実行するだけのペイロードを実行することができ、ジョブを言いました。

これを行う1つの方法は、状態ファイルを使用してペイロードが最後に実行された時間を維持し、その後適切な時間が経過した後にのみペイロードを実行することです。たとえば、このスクリプトはペイロードだけ(最終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] 
を210

具体的なケースでは、minGapを9000(秒で2時間半)に設定し、に基づいてcronのスクリプトを実行します。ギャップが経過してから待機する時間。

たとえば、潜在的な遅延が5分(後続のジョブが先行ジョブから90〜95分後に実行されている)に満足しているとします。その後、スクリプトが5分ごとに実行されるようにcronを設定します。

関連する問題