クローン操作、ランダムに始まったが時間範囲内

クローン操作、ランダムに始まったが時間範囲内

スクリプトを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~300から30(含む)のランダム値が生成されます。両方の数字のいずれか(または両方)が省略されている場合は、~そのフィールドの適切な制限(低または高)が使用されます。

30~45 * * * * somecommand

somecommandしたがって、1時間30分から次の15分までの15分間隔のいずれかの時点で実行されます。

~ピカの使用により一つただし、範囲内で任意の値が与えられた場合、crontabエントリ(例:

~ 9~11 * * * somecommand

質問のコマンドは、毎日午前9時から正午(午前11時59分)の間に実行されます。

また、見ることができます

警告(マニュアルには記載されていません):ランダムな時間はランダムに選択されますが、安定crontabが再ロードされるまで、つまりcronデーモンが再起動されるか、edit crontabが使用されるまでですcrontab -e。したがって、sleepwithを使用するのと同じように、ジョブを実行するたびに新しいランダムな値は提供されません$RANDOM

答え4

これらの回答のほとんどは、移植不可能な機能やbashismに依存しています。ダッシュを要求したので、次は移植可能なソリューションです。

0 9 * * * sleep $(echo | awk '{srand(); print rand()*3600*3}') && whatever_you_wanted_to_do

これは、POSIXに存在することが保証されているユーティリティと構文のみを使用し、最小限の最小インストールでもすべてのUNIXで動作します。

関連情報