LoginSignup
111
102

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-01-11

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 と使うと簡単に定時処理を組むことができる。
当たり前だがタスク名が違うなどのタイポをすると動かないので注意。
(私は何度かやってくっそハマった)

参考

111
102
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
111
102