ShellScript
Bash
Linux
cron
乱数

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

More than 1 year has passed since last update.


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

以下の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の書き方

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

ありがとうございました。