cronで祝日判定しようと思ったら、emasaka/jpholidaypが素晴らしかった

#python

TL;DR

  • emasaka/jpholidaypを使えば二値判定で祝日 or notが得られる
  • cronにM H d m 1-5 /path/to/jpholidayp || /path/to/cron-jobと入れれば、平日かつ非祝日にcronを実行出来る

平日動かしているjobが、祝日でも動いてしまう問題

cronは、* * * * 1-5 /path/to/programと入力すれば、月−金の平日にだけ仕事をするようになるが、祝日までは考慮しない。 営業日のみ、IRCへの通知やジョブの実行をしたい。

そこで、「cron 祝日」でググってみたところ、真っ先に以下がヒットした。

jpholidaypは祝日か否かを二値判定するプログラムで、祝日であれば0、祝日でなければ1を返す。

このプログラムはPythonで書かれているのだが、一枚の簡単なスクリプトになっているのが素晴らしい。 例えば営業日の10時に実効したいジョブがあれば、以下のように設定する。

0 10 * * 1-5 /path/to/jpholidayp || /path/to/job

これで月-金10時にcronが実行されるようになるが、祝日の場合はjpholidaypが0を返すため、jobは実行されない。

ちょっと気になったこと

以前のjpholidaypの祝日情報の取得はGoogle Calendarだったが、最近k1LoW/holiday_jpに切り替えた1らしい。

この変更は悪くないのだが、1つ残念なことがあって、jsonからyamlへとモジュールを変更してしまったようだ。 jsonはPython 2.6から標準ライブラリに搭載されているのだが、yamlは実は入っていない。 RHEL系ならyum install PyYAMLを使って、別途インストールしないと動かなくなってしまった。

とはいえ、pythonからyamlを扱うケースは往々にしてあるだろうし、そこまで嘆くほどでもない。 重要なのは、このたった一枚のスクリプトが、祝日か否かという面倒くさい問題を解決してくれることにある。 (あと、yamlが嫌なら古いバージョンを使えばいい2

jpholidaypをサーバに設置すれば即使用可能になるのは本当に素晴らしいと思う。


  1. https://github.com/emasaka/jpholidayp/commit/3985df2c9c868e74edac207fa7495d523255b3b9 [return]
  2. d29a61fの時点までは、Google Calendarからjsonで読み込んでおり、Python 2.6系なら問題なく扱えるようになる [return]