LoginSignup
1
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-03-26

~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リポジトリで公開しています。

参考文献

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0