cronで土日・祝日以外の平日を指定する方法
結論:この「shukujitsu」コマンドを使ってください。
まずはインストール
RedHatやCentOS、Amazon 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
$ 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への書き方
コマンド中にパーセント記号 (%) が バックスラッシュ (\) によってエスケープされずに置かれていると、 改行文字に置き換えられ、最初に現れた % 以降の全てのデータは 標準入力としてコマンドに送られる。
この辺りの情報、特に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年の祝日判定も可能になっているはずです。