Rails的cronの使い方

Railsアプリケーションで、一定間隔で処理を実行したい。
普通のプロセスならcronでやればよいのだけれど、そこはRails。プロジェクト環境内で済ませられればOSを選ばずに快適のはず。

Hello, world! 瀧内@ドリコム研究室のブログ:RailsCronプラグインを使う

RailsCronプラグインを利用すると、定期的に繰り返される処理を簡単に実装する事ができます。 普通はこのような事を実現する為に cron を使う事が多いと思いますが、Railsアプリケーションは起動しっぱなしで使う事が多いので、こういう方法もありですね。

という記事を見つけました。cron情報保存にActiveRecordを使う、コテコテのRails依存なcron。
リポジトリパスが変わっているのと、ちょっと引っかかったところがあったので手順をメモ。

RailsCronプラグインを使う

1. プラグインをインストールする(not_supportedってのは「質問は勘弁な」ってことかしらね)
./script/plugin install -c http://svn.kylemaxwell.com/not_supported/rails_cron/trunk/
2. Railsプロジェクトディレクトリ/lib/cron.rbを作成し、内容を記述。
  • cronから「HogesController」の機能を呼び出す想定。(たぶん悪い使い方なので良い子はマネしないでね)
  • cron登録用として「setup_db」関数を用意。内容は、設定全削除&登録処理。
  • cron動作その1として「search_hoge」関数を用意。setup_db内での設定により定期的に呼び出される。
require 'application'
require 'hoges_controller'

module Cron
  #
  #== Cron setup
  #
  def Cron.setup_db
    RailsCron.destroy_all
    
    #setting 1: search hoge
    RailsCron.create(
      :command => "Cron.search_hoge",
      :start => -1.minutes.from_now,
      :every => 15.seconds)
  end
  
  #
  #== CronJob: Search hoge
  #
  def Cron.search_hoge
    puts "Searching..."
    HogesController.new.search_all_for_cron
    puts "...done."
  end
end
3. 試しに実行。

cronに登録するJob(関数)がほんとに動くか確認。

./script/console
>> Cron.search_hoge
Searching...
...done.
=> nil

動きました。

4. cronを走らせる。
rake cron_start

RailsCronが動き始める。(初回にはcron用テーブルがDBに作成される)


(2006/10/13補足)
rake内でUNIXコマンドを使っているため、Windowsでは

rake cron_foreground

として起動する必要がある。これならrubyだけで動く。

5. cron登録を実行。
./script/console
>> Cron.setup_db

先に作ったcron.rb内の関数が実行され、cron情報がDBに登録される。もうcronは動いてるので、待っていれば動くはず。

cron用関数が、./script/console内で動くのにcron_startでは動かない場合

ほとんどがrequire忘れに相違ないですよと。
RailsCronは./script/runnerで起動されるせいなのか?必要なものは自分でrequire。一括で設定できる方法とかあるのだろうか?

注意事項

  • READMEを読みましょう。
  • RAILSCRON_SUDOでsudoユーザが指定可能。
  • 実運用時、RAILS_ENVの設定を忘れずに。指定しないとdevelopmentで動く。