knqyf263's blog

自分のためのメモとして残しておくためのブログ。

cronで祝日判定するためのコマンドを作った

概要

cronで営業日だけ動かしたいコマンドとかある時に、いちいちプログラム書くのも面倒だったので、 && とかで繋いで簡単に判定するためのコマンドを作りました。
rpmdebもあるので、簡単にインストールして利用可能です。

営業時間に1時間ごとに動かしたい場合は以下のような感じ。

00 9-18 * * 1-5 holiday_jp-go || command

github.com

経緯

GitHubでレビュワーとしてアサインされてるのにレビューし忘れる場合が多くて、もう1時間に1回レビューしてないPRを通知したろ!ということでcronを仕込みました(そもそもレビュー忘れとか皆さんはどうやって解決してるんですかね...?)。
で、自分は休日もPRとか作ってしれっとアサインするんですが、営業日になったら通知して欲しくて例によって祝日判定をしたくなりました。
そういう時にcronで || とか && で繋いで判定するコマンド標準であるだろ〜と思って調べたら意外と見つからなかったです。
祝日判定も他の人がどうやってるのか知りたいです。

唯一自分のニーズに合ったものを見つけたのですが、Pythonでした。
GitHub - emasaka/jpholidayp: Is it holiday today in Japan?

最近Goばかり書いている自分は、pipとかでインストールするのも面倒に感じるほど脳が後退しているので、ワンバイナリでサーバにシュッと置きたいなーと思ってGoで書きました。
あとCentOS 6とか作ってるとPython 2.6だったりして色々面倒で、真面目に使う時はvenvとかも使いますがちょっとしたサーバに入れるならやっぱりrpmとかで入れたいよなーと思ってます。

実装

祝日自体は以下のholiday_jpのyamlを使わせていただきました。
GitHub - holiday-jp/holiday_jp: Japanese holiday datasets

ファイルとしてサーバにYAML置くのも嫌だったので、 go-assets 使ってバイナリに埋め込みました。
なので本当にバイナリを1つだけ置けば動きます。

ただ、もちろんお気付きの通り祝日が変わると対応できないです。
ネットワーク経由で取ってきてキャッシュして、定期的にアクセスして更新して〜とやった方が厳密なのは分かるのですが、そこまでシビアな用途じゃなかったのでポータビリティ性を重視してAssetにしました。 祝日変わったらバイナリをアップデートする感じでいいかなと思っています。
逆に祝日判定を間違ったら死ぬようなシビアな用途では使えない感じになってます。 YAMLには2050年の祝日まであるので、期間が問題になることはないかなと。

30分ぐらいで作ったのでコードも50行ぐらいしかないです。
何かおかしかったら直します。

インストール

READMEに書いたとおりです。

RedHat, CentOS

$ sudo rpm -ivh https://github.com/knqyf263/holiday_jp-go/releases/download/v0.0.1/holiday_jp-go_0.0.1_linux_amd64.rpm

Debian, Ubuntu

$ wget https://github.com/knqyf263/holiday_jp-go/releases/download/v0.0.1/holiday_jp-go_0.0.1_linux_amd64.deb
$ sudo dpkg -i holiday_jp-go_0.0.1_linux_amd64.deb

その他

以下からバイナリをダウンロード Releases · knqyf263/holiday_jp-go · GitHub

挙動

実行しても特に何も出力されないですが、終了ステータスで判定できます。

0: holiday
1: not holiday
2: error

土日または祝日の場合は0(成功)になります。

crontabなどで使う想定です。
祝日だけに実行したい場合

holiday_jp-go && some-command

営業日だけに実行したい場合

holiday_jp-go || some-command

まとめ

バイナリ置くだけでcronなどで使える祝日判定コマンドを作りました。
祝日の更新は自動で追従しないので(元号変わって祝日変わったりとか)、シビアな用途では使えないです(更新機能必要な人がいればPR待ってます)。
ただ、企業の特別な休みとかに対応できないので、そういうのも休日と判定したいニーズとかあるかもなーと作った後に思いました。