whenver とは
cron の設定を簡単な文法で書ける gem。
RSS の作成やレポートの作成など、定時実行の処理を whenever を使うと Ruby を使って設定できる。
github(javan/whenever)
gem をインストール
gem 'whenever', require: false
で bundle install
定時実行処理の設定ファイル作成
$ wheneverize
を叩くと config/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
と使うと簡単に定時処理を組むことができる。
当たり前だがタスク名が違うなどのタイポをすると動かないので注意。
(私は何度かやってくっそハマった)