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で動く。