cron, crontab, and more

※ タイトルには意味ないです。

Unix の伝統的なツールで、かつ GNU のツールが(普及|台頭)していないものには意外と細かいバージョンの違いがある。cron もその一つ。

自分で見て試した限りでは以下のような違いがあった。

FreeBSD/etc/cron.d/* を読まない
Linuxcron -j でジョブの実行を数秒分散させるってことはできない?

実行時間の分散についてはランダムにずらすよりは fcron や uschedule の方が賢いのでそんなに気にする必要はないだろうけど、FreeBSD の「設定ファイルを分けることができない」っていうのは、設定するものが増えてくると面倒なような気がしないでもない1

で、それとは別に cron て意外と不便だなと思うのは

  1. 秒単位の指定はできない
    • やるとしたらプログラムを指定秒 sleep してから動くようにセットする
  2. 「第2月曜」という指定はできない
    • やるとしたら月曜日に実行を予約して、立ち上げたプログラムの方で第2に当たるかどうかをチェックしないといけない

辺り。この辺は Windows のタスクスケジューラの方がよくできている。2

特に 2 のような要求はビジネスでスケジューリングしたいときには結構出てくると思う。毎月の最終営業日が終業したタイミングでバッチ処理を走らせる、なんてのはいかにもありそうだ3。その辺考えると伝統的な cron に代わるスケジューラってあってもよさそう。ということでもう一度調べたらこんなものを見つけた。

  • Mcron - GNU Project - Free Software Foundation (FSF)
    • Guile で書く
  • Fcron : a periodical command scheduler for Unix and Linux systems
    • load average とか気にしてくれます。ほとんど cron 互換と言っても差し支えないような?
    • 24時間動いてなくてもいいらしい。その機能は結構嬉しい。開発用クライアントマシンで daemon のログがものすごいことになったりするのをうまく解決できるかも。あんまり細かく見てないけど。
  • uschedule
    • もうちょっと細かい指定ができるんだけど、互換性もなくなってきてるし、なんでこんなにいっぱい分かれてるんだろ?

load average を見て実行を遅らせるとか、やっぱシステム寄りの見方が中心なのかなぁという感じがする。

OSX は launchd で iCal との連携も強化してるっぽいけど、ぱっと見た感じ XML を使うみたいで、直書きのことは考慮してないかなぁ? まぁ人間に都合のいい細かい情報って、逆に機械に読みやすい形式で書式を決めていくのが面倒なケースも多いのでしょうがないのかもしんない。

つーことで結局のところ mcron のようなアプローチで、自分の書きやすい言語で日時などの条件をチェックしてから目的のプログラムを動かす、っていう流れにしちゃうのがいちばんいいのかもしんない。一瞬、YAML で設定ファイルを〜とか思ったけど、そういうことはしない方がたぶんいい。その方法で簡単に記述できるような条件なら、妥協も組み合わせて既存の crontab のフォーマットで再現すべきだろう。

ブツは cron ジョブに複雑な条件を与えやすくする の方に載せました。

  1. 分かれてる方が面倒なケースもあるし、一概には言えないけど。 

  2. タスクスケジューラが設定一覧をファイルに簡単に吐き出せるとか、逆にファイルからサクっと設定を読み込めるとか、そういうことができれば使いやすいのになぁ。 

  3. この場合は日付でも指定できないし、曜日でも指定できない。毎月1日の前日の夜、という指定で置き換えるなら条件的にはもう少し楽になるけど。 

More