この記事は最終更新から1年以上経過しています。 気をつけてね。
複数のサーバでDailyなタスクを登録する際、時刻をランダムにしておきたいことがあるので適当に生成する。
bash
$ MIN=`bash -c 'echo $(($$ % 60))'`
$ HOUR=`bash -c 'echo $(($$ % 24))'`
$ TASK="$MIN $HOUR * * * /bin/true"
$ sudo echo "$TASK"
39 16 * * * /bin/true
新規Bashに振られるプロセスIDを元にMIN,HOURの行は毎回違う値になる。
bash的ノウハウを使っているのはこの辺。
- プロセスID $$が毎回違う値になるように別シェルを起動する
- シングルクォートの遅延展開にしないと$$は親のPIDになる
- 二重括弧$(())で演算、商の余りで無効な時刻生成を回避
- TASKのところはダブルクォートで$MIN.$HOURを展開しないと最後のEchoでそのまま出現する
- クォート無しでは$HOURがコマンドとして解釈されて代入できない
- $TASKはクォートなしだと"*"がカレントディレクトリのファイル一覧に展開されて大変危険
sudoはroot以外からcronの設定ファイルに直接突っ込むためにつけてみた。rootなら不要だがcron関連のパーッミッションには注意。