Edited at

gem whenever を使って Rails で定時処理を作る

More than 1 year has passed since last update.


whenver とは

cron の設定を簡単な文法で書ける gem。

RSS の作成やレポートの作成など、定時実行の処理を whenever を使うと Ruby を使って設定できる。

github(javan/whenever)


gem をインストール

gem 'whenever', require: false

bundle install


定時実行処理の設定ファイル作成

$ wheneverize

を叩くと config/schedule.rb ができる。

この schedule.rb が処理の設定ファイルになるのでここに処理を記述。


設定ファイル


schedule.rb

every 3.hours do # 1.minute 1.day 1.week 1.month 1.year is also supported

runner "MyModel.some_process"
rake "my:rake:task"
command "/usr/bin/my_great_command"
end

every 1.day, :at => '4:30 am' do
runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
end

every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot
runner "SomeModel.ladeeda"
end

every :sunday, :at => '12pm' do # Use any day of the week or :weekend, :weekday
runner "Task.do_something_great"
end

every '0 0 27-31 * *' do
command "echo 'you can use raw cron syntax too'"
end


上記のコードのようにして設定していく。デフォルトでは


  • command

  • runner

  • rake

  • script


    job_type と呼ばれる4種類の処理を行うことができ、時間も好きに設定できる。

ちなみに上の job_type については酒と泪とRubyとRailsとさんが綺麗な言葉にまとめてくれているので以下抜粋。

command: bashコマンド実行

rake: rakeタスク実行
runner: Rails内のメソッド実行
script: scriptの実行

これらはデフォルトでは以下のコードと同じ挙動をする

job_type :command, ":task :output"

job_type :rake, "cd :path && :environment_variable=:environment bundle exec rake :task --silent :output"
job_type :runner, "cd :path && bin/rails runner -e :environment ':task' :output"
job_type :script, "cd :path && :environment_variable=:environment bundle exec script/:task :output"

ちなみに自分で job_type を作成する場合は

job_type :awesome, '/usr/local/bin/awesome :task :fun_level'

every 2.hours do
awesome "party", :fun_level => "extreme"
end

1行目のようにして作成して、4行目で書いたようにして使う


cronで見る

$ whenever

[add] writing `./config/schedule.rb'
[done] wheneverized!

を叩くと schedule.rb を cron の文法にしたものが確認できる


crontab に書く

定時処理は crontab をもとに実行するのでその設定が必要になるが

whenever ではコマンドを叩けば schedule.rb をもとにやってくれる。

コマンドは以下

$ whenever -i

または

$ whenever --update-crontab

今回は --update-crontab オプションを指定しているが、

他にもいろいろなオプションがあり

$ whenever -h

で確認できる。

この作業やっておかないと schedule.rb を処理実行されないので自動化してしまったほうがいいかも

弊社ではデプロイと同時にコマンドを叩くようにしている。


まとめ

こんな感じで whenever と使うと簡単に定時処理を組むことができる。

当たり前だがタスク名が違うなどのタイポをすると動かないので注意。

(私は何度かやってくっそハマった)


参考