はてブロ@ama_ch

https://twitter.com/ama_ch

cronで90分おきにコマンドを実行したい

crontabで○分おきにって00-59しか指定できないんですよね!*1
じゃあ90分おきに実行したい場合はどうしよう?と思って、crontabに

*/30  *  *  *  * test $( expr $( date +%s ) % 5400 ) -eq 0 && hoge.zsh

と書いてみたけど動かない。。


しょうがないから、crontabは

*/30  *  *  *  * hoge.zsh

として、90分の判定はhoge.zshで判定することにしました。


hoge.zsh

# 90分ごとにコマンドを実行
DATE=`date "+%Y.%m.%d  %H:%M:%S"`
DATE_SEC=`date +%s`    # 現在のエポック秒(1970.1.1 0:00:00からの経過時間)
DATE_MIN=`expr $DATE_SEC / 60`    # エポック秒を分に変換

if [ `expr $DATE_MIN % 90` -eq 0 ];
then
    echo $DATE >> ~/scripts/hoge.log
    # ここに実行したいコマンド
else
    echo "nonAction.$DATE... $DATE_MIN:$DATE_SEC" >> ~/scripts/hoge.log
fi

こんな感じかなー。cronで30分に1回このスクリプトが実行されて、更にスクリプト内で90分かどうかをチェックします。
最初date +%sを5400秒(90分)で割っていたんだけど、実行時に1秒ほどずれてしまうことが度々あったので、分に変換しています。

*1:正確には、毎時00-59/○分