whenever を使って rails で crontab を扱う

シェアする

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

この readme 通りにやれば動くがメモ代わりに残しておく。

Sponsored Links

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']

whenever を実行する環境を指定する

whenever はデフォルトでは environment に production を指定するが、 development など他の環境で動かすには以下のようにコマンドを実行する。

$ bundle exec whenever --update-cron --set environment=development
Sponsored Link

シェアする

フォローする