Help us understand the problem. What is going on with this article?

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

参考

hirotakasasaki
マイブームはサーフィン、コーヒースタンド。ご一緒できる方ぜひに。
favy
デジタルマーケティングのスペシャリストと飲食業界出身の食のスペシャリストでチームは構成されていて、飲食市場に特化したマーケティング支援を軸に「飲食店がかんたんに潰れない世界を創る」を真剣に実現するためにチャレンジしています。
http://www.favy.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした