cronでは設定できない特定時間の実行除外方法


~cronでは細かく設定できない部分をシェルスクリプトによって、実装したのでその記録~

背景

cronによるジョブ(シェルスクリプト)の定期自動実行は最もメジャーな手段であると思う。
ただ、cronでは特定時間だけ実行を見送るといった設定が難しい。
毎日5分おきにジョブを定期実行しているとする。
時間単位(ex.15時~16時)での除外であれば、crontabの時に「0-15,16-24」と設定すれば良い。
しかし、15時30分から16時00分はジョブ実行をしないといった設定をcrontabに指定できない(私の調べた限り設定方法が見つからなかった)。
『ある時間帯の何分間だけ除外したい』 といった場合はどうしたら良いの!?
『起動するジョブ(シェルスクリプト)で制御するしかないでしょ!』 ということでスニペットレベルで作成してみたので、その記録をここに残します。

実装内容

起動時間範囲を記載した設定ファイル(time.csv)を読み込み、現在時刻がこの起動範囲であれば、「Hello!」と出力し、それ以外であれば、「Out of time」と出力するシンプルなスニペット。

echo_Hello.sh
#!/bin/bash
readonly configFile="time.csv"

declare -a csv_data

currentTime=`date +"%H%M"`

while IFS=, read -a csv_data;
do
	echo "From=" ${csv_data[0]}
	echo "To=" ${csv_data[1]}
	echo "currentTime=" ${currentTime}
	if [ $currentTime -ge ${csv_data[0]} -a $currentTime -le ${csv_data[1]} ]; then
		echo "Hello!"
	else
		echo "Out of time!"
	fi
done < "${configFile}"
time.csv
0000,1530
1600,2400

シェルスクリプトについて補足

  • readonlyは、変数を読み込み専用とする指定。設定ファイルを誤って書き換えないように配慮してみました。
  • 「declare -a」は、配列として変数を定義する指定。

設定ファイル(time.csv)の内容

第1列名が、起動させたい下限時間
第2列名が、起動させたい上限時間

実行方法

crontabで「echo_Hello.sh」定期間隔で実行するように設定すれば、15時30分から16時00分以外で「Hello!」と出力されてそれ以外であれば「Out of time」と出力される。
crontabに5分おきに実行する設定例

5分おきに実行する設定例
$ crontab -e
# 5分おきに実行
*/5 * * * * ./echo_Hello.sh

サンプルスニペットソース

このスニペット自体は、活用できる機会は少ないかもしれないけど、私のGitHubリポジトリで公開しています。

参考文献