開発したアプリなど一覧

whenever を使って rails で crontab を扱う

記事内にアフィリエイトリンクを含む場合があります

Rails で作成した Web アプリで一部の処理を cron で動かしたいと思ったので調べたら whenever を使うのが良さそうだったのでやってみた。

javan/whenever · GitHub

この 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

Sponsored Link

コメント

タイトルとURLをコピーしました