スクリプトを1日1回、0900から1200の間で起動して実行したいと思います。
ダッシュ構文についてはよくわかりません。これはスクリプトが時間ごとに実行されることを意味しますか9-12
、それともランダムに起動されますか9-12
?なぜなら私には後者が必要だからです。
答え1
私はランダムにタスクを実行する方法があるcronの実装を見たことがありません。これは奇妙な要求です。文書に示されているように、これは9時から12時までの時間を表す9-12
略語です。9,10,11,12
ランダムな時間にジョブを実行するには、間隔の開始時にジョブを実行し、ランダムな遅延を追加します。たとえば、9時から12時までのランダムな時間に実行するには、次のようにします。
SHELL=/bin/bash
0 9 * * * sleep $((3600 * (RANDOM \% 4))); do_stuff
bashまたはkshがRANDOM
必要で、デフォルトのシェルでは使用できない可能性があります。
9:00~12:00の間にランダムな時間で実行し、2番目の解像度が必要な場合はRANDOM % 10800
それを遅延として使用できますRANDOM
が、範囲は0..32767なので、遅延は0から32768の間で偏向されます。 %10800=368. このようなバイアスを防ぐには、次のようにします。
SHELL=/bin/bash
0 9 * * * max=$((32768/10800*10800)); while delay=$RANDOM; ((delay > max)); do :; done; sleep $((delay \% 10800)); do_stuff
答え2
私はPythonスクリプトと同様の要件を持っていましたが、最終的にスクリプト自体を介してランダム+睡眠機能を使用し、真夜中にクローンを始めることでこれを達成しました。
from time import sleep
import random
sleep_time = random.randint(0,7200) #7200 seconds = 2 hours * 60 min * 60 sec
print(sleep_time)
sleep(sleep_time)
答え3
OpenBSDでは、バージョン6.7(2020年4月15日頃のスナップショット)以降、~
crontabファイルに任意の間隔を指定できます。
~
フィールドの文字を使用して、任意の値(適切な範囲内)を取得します。ランダム値の間隔は明示的に指定できます。たとえば、0~30
0から30(含む)のランダム値が生成されます。両方の数字のいずれか(または両方)が省略されている場合は、~
そのフィールドの適切な制限(低または高)が使用されます。
30~45 * * * * somecommand
somecommand
したがって、1時間30分から次の15分までの15分間隔のいずれかの時点で実行されます。
~
ピカの使用により一つただし、範囲内で任意の値が与えられた場合、crontabエントリ(例:
~ 9~11 * * * somecommand
質問のコマンドは、毎日午前9時から正午(午前11時59分)の間に実行されます。
また、見ることができます
警告(マニュアルには記載されていません):ランダムな時間はランダムに選択されますが、安定crontabが再ロードされるまで、つまりcronデーモンが再起動されるか、edit crontabが使用されるまでですcrontab -e
。したがって、sleep
withを使用するのと同じように、ジョブを実行するたびに新しいランダムな値は提供されません$RANDOM
。
答え4
これらの回答のほとんどは、移植不可能な機能やbashismに依存しています。ダッシュを要求したので、次は移植可能なソリューションです。
0 9 * * * sleep $(echo | awk '{srand(); print rand()*3600*3}') && whatever_you_wanted_to_do
これは、POSIXに存在することが保証されているユーティリティと構文のみを使用し、最小限の最小インストールでもすべてのUNIXで動作します。