カテゴリー:
Rails
タグ:
 Rails Whenever crontab

このエントリーをはてなブックマークに追加
更新日時:
2012年11月30日(金)
作成日時:
2012年11月30日(金)

前の記事 / 次の記事

crontabを直接書いてもいいんだけど、
Wheneverを使ってスケジュールすることで、デプロイのタイミングでcrontabを更新してくれたり、
アプリケーションごとのスケジュールが分かりやすくなって便利。

【参考ページ】
Whenever
WheneverでRailsのバッチ処理
stackoverflow:Rails cron whenever, bundle: command not found

やること

  1. Wheneverのインストール
  2. Wheneverの設定
  3. 設定の反映
  4. Capistranoとの連携

1.Wheneverのインストール

$ vi Gemfile
gem 'whenever'

で、bundle install

2.Wheneverの設定

設定は config/schedule.rb に書く。

$ bundle exec wheneverize .

で config/schedule.rb に次ような雛形が出来るのでそれを参考に書く。

$ vi config/schedule.rb
set :output, "/path/to/my/cron_log.log"

every 2.hours do
  command "/usr/bin/some_great_command"
  runner "MyModel.some_method"
  rake "some:great:rake:task"
end

every 4.days do
  runner "AnotherModel.prune_old_records"
end

直接実行する時はうまく行っていてもcrontabに仕込むと、コマンドが見つかりませんとかcommand not found
とか言われて走れないことがあるので、その時は、schedule.rb の先頭に次の行を追加する。

env :PATH, ENV['PATH']

3.設定の反映

設定は次の手順で設定を反映させる。

まず、作成したスケジュールを確認(この時点ではまだcrontabには反映されない)。

$ bundle exec whenever

内容を確認して問題がなければ、次のコマンドでcrontabに反映させる。

$ bundle exec whenever --update-crontab

Capistranoを使ってデプロイしている場合は、次の手順で
同じことをデプロイのタイミングで自動的に実行させることが出来る。

4.Capistranoとの連携

Capistranoの設定ファイルを開いて適当な場所に次の行を追加。

$ vi config/deploy.rb
set :whenever_command, "bundle exec whenever"
require "whenever/capistrano"

これだけでデプロイのタイミングで自動的にcrontabの内容も更新されるようになる。