これは非常に簡単で、cron
定期的に発生するタスクをスケジュールするために使用できます。特定のことがあまり頻繁に発生したくないです。たとえば、ジョブを実行して再試行する前に、2〜12時間待つ必要があります。 (ここでは合理的な種類のランダム性が機能します。)これを行うための良い方法はありますか?
答え1
「at」コマンドを使用できます。
at now +4 hours -f commandfile
または
at now +$((($RANDOM % 10)+2)) hours -f commandfile
答え2
オプション1
cronはジョブを毎時間(または毎時間)実行するようにスケジュールしますが、ジョブの前に次の接頭辞を付けます(SHELL=/bin/bash
crontabにあると仮定)。
[ $[RANDOM % 12] -eq 0 ] || exit 0; YOUR_JOB_HERE
これにより、ジョブが毎回予定通りに実行される確率は約12分の1です。
オプション2
1日の開始時にランダムな時間を計算し、それを使用して1日のすべてのat
実行をスケジュールするクローンジョブをスケジュールします。これははるかに複雑ですが、さまざまなランダム分布を使用できます。たとえば、12時間より2時間多い場合があります。
美しい印刷
*この乱数の生成方法は実際に偏っています。問題は、最大値(32767)が12(減算1)の倍数ではないことです。問題を明確にするには、最大値が11(12×1-1 = 11)かどうかを比較してください。 0は0を生成し、1は1を生成するように11が11を生成するまで続きます。しかし、13の場合、12は0を生成し、13は1を生成します。だから0と1は二つ値を生成しますが、2-11には1つの値しかないため、可能性は低くなります。したがって、偏向的です。最大値で除算式を使用するように切り替えても問題は解決されず、歪んだ数だけが変更されます。実際の修正にははるかに多くのコードが必要です(基本的に不要な場合に再試行して最大値を偽装することも含まれます)。