Rails で作成した Web アプリで一部の処理を cron で動かしたいと思ったので調べたら whenever を使うのが良さそうだったのでやってみた。
この readme 通りにやれば動くがメモ代わりに残しておく。
whenever のインストール
Gemfile に以下の一行を追加し、bundle install する。
gem 'whenever', :require => false
それか直接 gem install whenever しても入る。
インストールできたらプロジェクトのあるディレクトリに移動し、wheneverize コマンドを実行、設定ファイルを生成する。
$ bundle exec wheneverize .
[add] writing `./config/schedule.rb'
[done] wheneverized!
これで config 以下に schedule.rb ファイルが生成される。ここに設定を記述する。
whenever の設定
whenever で指定できるのは通常のコマンド、rake、runner、script の4種類。それぞれ以下のように指定する。
runner "MyModel.some_process"
rake "my:rake:task"
command "/usr/bin/my_great_command"
# script は知らん、が
script "hoge" # みたいに書いたら動きそう。
実行する日時、タイミングは以下のように指定する。
# 3時間毎に実行
every 3.hours do
rake "my:rake:task"
end
# 毎日午前四時半に実行
every 1.day, :at => '4:30 am' do
runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
end
# 毎時実行
every :hour do # 以下のショートカットが使える :hour, :day, :month, :year, :reboot
runner "SomeModel.ladeeda"
end
# 日曜の午後12時に実行
every :sunday, :at => '12pm' do # 各曜日や :weekend, :weekday という指定も可能
runner "Task.do_something_great"
end
# cron 形式の指定も可能
every '0 0 27-31 * *' do
command "echo 'you can use raw cron syntax too'"
end
whenever --update-cron で設定内容を crontab に反映させる。
$ bundle exec whenever --update-cron
[write] crontab file updated
$ bundle exec whenever
30 4 * * * /bin/bash -l -c 'cd /path/to/project && RAILS_ENV=production bundle exec rake hoge:fuga --silent'
## [message] Above is your schedule file converted to cron syntax; your crontab file was not updated.
## [message] Run `whenever --help' for more options.
また、--clear-cron を使う事でクリアできる。
$ bundle exec whenever --clear-cron
[write] crontab file
便利っぽい。
whenever で設定した cron の実行時に command not found と出る
whenever でタスクを実行時に以下のようなエラーが crontab より出た。
/bin/bash: bundle: command not found
自分で crontab に指定されているコマンドを実行した分には問題は無かったが、crontab に実行結果には上記のようにエラーが出ていた。
これを解決するには ./config/schedule.rb に以下を追加したのち bundle exec whenever --update-cron する。
env :PATH, ENV['PATH']
http://stackoverflow.com/questions/9482298/rails-cron-whenever-bundle-command-not-found
whenever を実行する環境を指定する
whenever はデフォルトでは environment に production を指定するが、 development など他の環境で動かすには以下のようにコマンドを実行する。
$ bundle exec whenever --update-cron --set environment=development
コメント