たとえば、スクリプトを1日2〜3回(24時間)実行できるようにしたいのですが、毎回異なる時間に実行できます。
あなたは何をお勧めしますかシンプルで信頼できる解決策?
スクリプトを1日2回実行するには:
0 0,12 * * * sleep $(( $$ \% 21600 )); /path/to/script.sh
これにより、正午と真夜中にジョブが開始され、スクリプトを開始する前に最大6時間(12時間間隔の半分)スリープします。
スクリプトを1日3回実行するには:
0 0,8,16 * * * sleep $(( $$ \% 14400 )); /path/to/script.sh
これにより、ジョブは午前0時、午前8時、および午後4時に開始され、スクリプトを開始する前に最大4時間(8時間間隔の半分)スリープします。
これをUbuntuでタグ付けしたので、デフォルトの/ bin/shとしてbashが使用されている可能性があります。これは、$ RANDOMを解釈しているようです(RANDOMがPOSIXで指定されていないにもかかわらず)。したがって、予測不可能性を高めるために、Zwansの回答を次のように調整します。
1日2回の実行:
0 0,12 * * * sleep $(( RANDOM \% 21600 )); /path/to/script.sh
1日3回の実行:
0 0,8,16 * * * sleep $(( RANDOM \% 14400 )); /path/to/script.sh
&&
を;
に変更しました。これにより、意味が「sleepコマンドが正常に終了するまで待機」から「スリープが完了したか終了したかに関係なく、しばらくスリープする」に変更されます。 %
はエスケープする必要があります がcronコマンドの一部である場合は、それが改行として解釈されることにも注意してください。