12
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-05-21

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

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

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

12
9
1

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
  3. You can use dark theme
What you can do with signing up
12
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?