2008-08-11

periodic_forwarder を書いた

cron シリーズ、何個目だ?

以前から cron の管理が面倒くさいことは書いているのですが、periodic, run-parts を利用することで厳密な時間設定の必要ないスクリプトの管理は比較的楽になりました。しかし、すべてのスクリプトがシステムワイドな cron ディレクトリにあると都合の悪い場合もあります。

そこでこんなものを書いてみました。

/lang/ruby/misc/periodic_forwarder CodeRepos::Share

どういうものかと言うと、

/etc/periodic/
|-- daily/
|   `-- periodic_forwarder*  ->  periodic /BASE_DIR/foo/FILLING_PATH/daily/
|-- monthly/
|   `-- periodic_forwarder*  ->  periodic /BASE_DIR/foo/FILLING_PATH/monthly/
`-- weekly/
    `-- periodic_forwarder*  ->  periodic /BASE_DIR/foo/FILLING_PATH/weekly/

こんな感じで、システムワイドな cron ディレクトリにこのスクリプトを置いておく(実際には link で ok)と、任意のディレクトリにこれを forward して、対応する period のスクリプト群を periodic, run-parts によって実行してくれるというものです。

※ 上の例は *BSD フレーバーなシステムの話ですが、Linux の /etc/cron.*/ 方式にも対応しています。

どういう場合に便利かというと、例えば

/var/www/HOST1/
/var/www/HOST2/
/var/www/HOST3/
/var/www/HOST4/

みたいに virtual host が設定されているとして、これらの HOST ごとに異なる仕事を定期的に実行させたいときなどに威力を発揮します。

/var/www/HOST1/cron/
`-- daily/
/var/www/HOST2/cron/
`-- weekly/
/var/www/HOST3/cron/
`-- daily/
/var/www/HOST4/cron/
`-- monthly/

こんな感じで定期実行するスクリプトを置くディレクトリを用意したら、

BASE_DIR     = /var/www
FILLING_PATH = cron

となるように設定してこのスクリプトをセットしておきます。

これで、ある HOST のための cron ジョブはちゃんとその HOST 用のリポジトリの中に収めておくことができます。

設定をスクリプトと分離する処理はちゃんと書いてない1ので、ちょっと中身を書き換えてもらわないといけないですけど。すいません。一応起動時のオプションで設定を与えることはできるようにしてあるので、お試しで動かすことはできると思います。

とりあえず自分はこれで目的が達成できそうなので、今は結構ホクホクしています。


しかしこういう、

  • オプションを指定できる
  • ディレクトリを自前でなめる

ものをシステム管理的によく書くのですが、どうも自分はこの二つが同時に入っているコードのテストを書くのが苦手です。Rake とか使ってコードを置くディレクトリからテスト用のコードを生成するとかすればいいんだろうけど、面倒くさくなってベタで書いちゃうからテストを公開できなくなっちゃうんですよねぇ。うーん。まだ全然へたくそだ。

  1. いや実際には書いたんだけど、shell スクリプトと設定を共有するという特殊な方法を考えているので現在リポジトリにはその部分は上げてません。 

About

例によって個人のなんちゃらです