cronでランダムな時間に実行する

土曜日, 8月 08, 2020

UNIX

t f B! P L

おはこんばんは。お久しぶり。
 
今日は cronでランダムな時間に実行する をやってみるぜ〜〜〜
 
cron+atコマンドでできます。

毎日19時0分〜59分の間にランダムなタイミングで1回だけ実行したい

何とは言いませんが、様々な事情でランダムにcronを実行したいことはあると思います。
 
調べた感じでは、cron単体ではランダムな時間に実行する機能はなく、スクリプト側でrandom秒sleepするみたいな残念なソリューションしか見つからなかった。
 
cronはあくまで決まった時間に実行する機能しかない。
 
そこでatコマンドを使います。
atコマンドはいわゆるキューで、スクリプトと実行時刻を指定すると、その時刻に1回だけ実行してくれるというコマンド。
 
atコマンド自体は知っていたが、自動化厨の私は、1回ってw毎回手動でセットするんすかw?とか思っていた模様。
 
キューなので時間遅延させて後で実行したいときに使えるんですね。

これがUNIX哲学か。

atコマンドの使い方

は、ぐぐればいいサイトがでてくるので割愛。
 
atは、時刻を指定して単発で実行する機能しかないので、時刻のフォーマットに関してはかなり柔軟な指定ができます。
 
私はcronで実行することを考え、以下のようにしています。

0 19 * * * zsh -c 'echo "python test.py >> log" | at now + $((1+$RANDOM\%60)) min'

sh(dash)だと$RANDOMが引数内で上手く動かないのでzshで実行、%はバックスラッシュでエスケープが必要などのハマりポイントはありました。

スクリプトは1行ならシェルスクリプトファイルにまとめなくても、echoからパイプで渡せるようです。
 
上記のコマンドを毎日19時にcronで起動するようにすると、19時ちょうどにatコマンドが呼び出され、atコマンドがnow(19時)から0〜59分後に python test.py を実行してくれます。
 
遅延時間がランダムになっている部分がポイントで、これで実行ごとに(この例だと毎日)別の時刻に実行することができます。
 
cronとatの時刻を調整することで色々柔軟にカスタマイズできると思います。

QooQ