cronで土日・祝日以外の平日を指定する方法

結論:この「shukujitsu」コマンドを使ってください。

github.com

まずはインストール

RedHatCentOSAmazon Linuxなどではyumを使って3ステップ、

$ sudo yum install -y curl
$ curl -fsSL https://sakurai-youhei.github.io/python-shukujitsu/rpm/python-shukujitsu.repo | sudo tee /etc/yum.repos.d/python-shukujitsu.repo
$ sudo yum install -y python-shukujitsu

DebianUbuntuならaptを使って5ステップ、

$ sudo apt install -y curl gpg
$ curl -fsSL https://sakurai-youhei.github.io/python-shukujitsu/gpg | sudo apt-key add -
$ curl -fsSL https://sakurai-youhei.github.io/python-shukujitsu/deb/python-shukujitsu.list | sudo tee /etc/apt/sources.list.d/python-shukujitsu.list
$ sudo apt update
$ sudo apt install -y python-shukujitsu

これで祝日判定のキモとなる「shukujitsu」コマンドが利用できるようになります。

次に基本的な使い方

この「shukujitsu」コマンドは日付を渡すと、その日が祝日の場合にはそのままの日付、もしくはnオプションで該当する祝日の名前を出力します。

$ shukujitsu 2020/7/24
2020/7/24

$ shukujitsu -n 2020/7/24
スポーツの日

そして逆にその日が祝日でなければ、コマンドは何も出力せずに異常終了します。この特性と、Linuxコマンドを連続して使うには - Qiita で紹介されている連続コマンドの書き方、「コマンド1 || コマンド2」を組み合わせると、

$ shukujitsu -n 2020/7/24 || echo 祝日ではない
スポーツの日
$ shukujitsu -n 2020/7/22 || echo 祝日ではない
祝日ではない

という様にコマンドの実行を祝日ではない場合に制限できます。また日付の部分にはUnixタイムスタンプも指定できますので、その瞬間を祝日かどうか判別しながらコマンドを実行するには、

$ shukujitsu -n `date +%s` || echo 祝日ではない
祝日の名前か「祝日ではない」と表示される

と書きます。

最後にcrontabへの書き方

Man page of CRONTAB

コマンド中にパーセント記号 (%) が バックスラッシュ (\) によってエスケープされずに置かれていると、 改行文字に置き換えられ、最初に現れた % 以降の全てのデータは 標準入力としてコマンドに送られる。 

f:id:sakurai_youhei:20201128115145p:plain

crontabの基本

この辺りの情報、特にdateコマンドの引数に含まれるパーセント記号の扱いに注意しながら、土日・祝日以外の平日にジョブをスケジュールするにはcrontabへの記述は以下のようになります。

↓↓ cronで土日・祝日以外の平日を指定する方法 ↓↓

# 祝日ではない月曜から金曜の日本時間午前6時30分に/path/to/commandを実行する
CRON_TZ=Asia/Tokyo
30 6 * * 1-5 /usr/bin/shukujitsu -n `/bin/date +\%s` || /path/to/command

運用上の注意事項

 この「shukujitsu」コマンド、内閣府が公開しているデータを祝日判定の元としている都合上、2020年11月28日時点では2021年末までの祝日判定にしか対応していません。

今後、内閣府がその祝日データを更新すれば、それに追従した更新版パッケージも公開する予定ですので、3カ月に1回くらいは「yum update」や「apt update && apt upgrade」でお使いの環境にインストールしたパッケージを更新するようにしてください。そうすれば2021年中には2022年の祝日判定も可能になっているはずです。