web-dev-qa-db-ja.com

不規則な間隔でジョブをスケジュールする

cronを使用して、ジョブが定期的に発生するようにスケジュールするのは簡単です。定期的に何かが発生しないようにしたいのですが、たとえば、ジョブを実行してから2〜12時間待ってから、再試行してください。 (ここでは、任意の合理的なタイプのランダム性が機能します。)これを行うための良い方法はありますか?

5
Charles

コマンド「at」を使用できます

at now +4 hours -f commandfile

または

at now +$((($RANDOM % 10)+2)) hours -f commandfile
10
jhilmer

オプション1

Cronでジョブを1時間ごと(または1時間おき)に実行するようにスケジュールしますが、ジョブの前に次のようなものを付けます(cronタブにShell=/bin/bashがあると仮定します)。

[ $[RANDOM % 12] -eq 0 ] || exit 0; YOUR_JOB_HERE

その後、スケジュールされるたびにジョブが実行される可能性は約12分の1になります。

オプション2

1日の開始時にランダムな時間を計算し、atを使用して今日のすべての実行をスケジュールするcronジョブをスケジュールします。これははるかに複雑ですが、さまざまなランダム分布を使用できるようになります。たとえば、2時間は12時間よりもはるかに可能性が高いようにすることができます。


ファインプリント

*この乱数の生成方法は実際には偏っています。問題は、最大値(32767)が12の倍数(マイナス1)ではないことです。問題を明確に確認するには、最大値が11(12×1-1 = 11)であるかどうかを比較します。 0は0を生成し、1は1を生成し、11は11を生成します。しかし、代わりに13の場合、12は0を生成し、13は1を生成します。したがって、0と1はtwo値を持ちます。それらを生成しますが、2〜11の値は1つしかないため、可能性は低くなります。したがって、その偏り。最大除算を使用して数式に切り替えても問題は解決せず、バイアスされる数値が変わるだけです。実際の修正ははるかに多くのコードです(基本的に、必要な最大値を偽造して、そうでないときに再試行する必要があります)。

6
derobert