小ネタである。
前提知識
bashでは、環境変数$RANDOM
を用いることで、0~32767 の数字をランダムに得ることができる。
例えば、0~3 の数字をランダムに表示するには、剰余演算子記号%
を組み合わせて次のようにする。
0~3の数字をランダムに表示
echo $((RANDOM % 4))
5~59 の数字ならこうだ。
5~59の数字をランダムに表示
echo $((5 + RANDOM % 55))
この辺の説明は【シェルスクリプトでランダムにアレをやる】 の方がずっと分かり易かったので、そちらを参照していただきたい。
cronの時刻フィールドを書き替えるには
本題。
最終行に次の cron が定義されているとする。
00 2 * * * /home/mindwood/foo.sh > /dev/null 2>&1
午前2時に起動する設定だが、これを、午前0時05分~午前3時59分の起動とし、幅を持たせたい。
その上で毎時ジャスト(午前1時、午前2時・・・)は避けたい。
書き替えるワンライナーはこうだ。
H=$((RANDOM%4));M=$((5+RANDOM%55));sed -i -e '$s/^[0-9]\+ [0-9]\+/'$M' '$H'/' /var/spool/cron/crontabs/root
例えば次のように更新される。
43 1 * * * /home/mindwood/foo.sh > /dev/null 2>&1
この時刻が気に入らなければ、何度でもやり直して良い。
なお、sed
の$
は最後の行を表す。
sed
についても、詳しくは 【sedでこういう時はどう書く?】 を参照して欲しい。