search
LoginSignup
8

More than 3 years have passed since last update.

posted at

updated at

cronをランダムに実行する設定

ランダム(乱数)で処理を実行するシェルコマンド

以下の3つはいずれも
処理echo "hello"を1/3の確率(33%)で実行できます。

[ $(($RANDOM % 3)) -eq 1 ] && echo "hello"
[ $(($RANDOM % 100)) -lt 33 ] && echo "hello"
if [ $(($RANDOM % 100)) -lt 33 ]; then echo "hello"  ; fi

1つずつ紐解いてみます。

$RANDOM とは

bash、zshであらかじめ用意されている環境変数で、
0から32767までの数字をランダム(乱数)出力させることが出来るようです。

試してみる

$ echo $RANDOM
26634
$ echo $RANDOM
7712
$ echo $RANDOM
15559

乱数を割った余りを出力する

乱数を割った余りを出します。
% 5とすれば、乱数を5で割った余り、すなわち0-4までの数字がランダムに出ます。

$ echo $(($RANDOM % 5))
2
$ echo $(($RANDOM % 5))
4

なおexprを使う方法もありますが、二重括弧((...)) の方が処理が早いようです。

$ echo `expr $RANDOM % 5`
3

乱数を使った様々なパターン

eq(イコール)を用いたケース

乱数を割った余りの数字1イコール(eq)だった場合に実行されます。

[ $(($RANDOM % 3)) -eq 1 ] && echo "hello" // 3回に1回
[ $(($RANDOM % 5)) -eq 1 ] && echo "hello" // 5回に1回
[ $(($RANDOM % 10)) -eq 1 ] && echo "hello" //10回に1回
[ $(($RANDOM % 100)) -eq 1 ] && echo "hello" //100回に1回

lt(より小さい)を用いたケース

乱数を割った余りの数字指定した数字より小さい(lt)場合に実行されます。

[ $(($RANDOM % 100)) -lt 33 ] && echo "hello" // 33%
[ $(($RANDOM % 100)) -lt 50 ] && echo "hello" // 50%
[ $(($RANDOM % 1000)) -lt 70 ] && echo "hello" // 7%
[ $(($RANDOM % 1000)) -lt 700 ] && echo "hello" // 70%

if文を用いてスクリプトも可能

if [ $(($RANDOM % 100)) -lt 33 ]; then echo "hello"  ; fi

cronをランダム(乱数)に設定する

必須コマンド

登録

$ crontab -e

ファイルがあれば、crontab ファイル名 でも可能です。

確認

$ crontab -l

cronをランダムに実行させる設定例

分 時 日 月 曜日

# 5分おきに実行。ただし33%の確率
*/5 * * * * [ $(($RANDOM % 100)) -lt 33 ] && echo "hello"

# 1,6,11,16..5分おきに実行。ただし33%の確率
01-59/5 * * * * [ $(($RANDOM % 100)) -lt 33 ] && echo "hello"

# 2,7,12,17..5分おきに実行。ただし33%の確率
02-59/5 * * * * [ $(($RANDOM % 100)) -lt 33 ] && echo "hello"

# 8:00と16:00と20:00に実行。ただし50%の確率
0 8,16,20 * * * [ $(($RANDOM % 100)) -lt 50 ] && echo "hello"

# 12:30,13:30,14:30,16:30,,,に実行。ただし80%の確率
30 12,13,14-22/2 * * * [ $(($RANDOM % 100)) -lt 80 ] && echo "hello"

Reference

今回調べるにあたり多くの記事を見ました。
特に下記の記事を参考にさせて頂きました。

シェルスクリプトでランダムにする方法
exprと二重括弧について
cronの実行時間の微調整1
cronの実行時間の微調整2
cron1時間に1回をワンライナー
cronの設定例
cronの書き方

いずれの記事も大変わかりやすくとても参考になる内容でした。
ありがとうございました。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
8