シェルスクリプトだけでコマンドを定期実行したい
Dockerコンテナでバックアップなどのコマンドを定期的に実行したいときがありますが、cronを使うのは手順が多くて面倒に感じていました。
そこでシンプルなシェルスクリプトで、定期的にコマンドを実行をする方法を考えたのでメモします。
#!/bin/bash
# 12時間ごとに実行する場合(秒数)
EVERY=$(( 60 * 60 * 12 ))
# 日本時間(+0900)に調整
OFFSET=$(( 60 * 60 * 9 ))
while true; do
# 次のタイミングまでスリープ
TS=$(( $(date "+%s") + $OFFSET ))
sleep $(( ($TS / $EVERY + 1) * $EVERY - $TS ))
echo "ここで好きなコマンドを実行"
done
上の例では毎日、日本時間の0時と12時に指定のコマンドを実行します。
機能面でcronにはもちろん敵いません。でも「ラフにn時間ごとみたいな定期実行したい」、みたいなときはこの方がわかりやすいかなと思いましたが、どうでしょうね。