web-dev-qa-db-ja.com

cronを介してランダムな時間にスクリプトを実行しますが、1日に特定の回数実行します

たとえば、スクリプトを1日2〜3回(24時間)実行できるようにしたいのですが、毎回異なる時間に実行できます。

あなたは何をお勧めしますかシンプルで信頼できる解決策?

1
Jodooomi

スクリプトを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コマンドの一部である場合は、それが改行として解釈されることにも注意してください。

3
Jeff Schaller