whenever、cronとは
cron
「クロン」または「クーロン」と呼ばれ○時になったら○○のコマンドを実行
といった具合に、定期的にコマンドを実行するためにメモリ場で常に命令を待機しているプロセス。
このcron
に対して命令を行うには、crontab
に記述しておけば、決まった時間に実行してくれる。
※UNIX系のOSには、cron
が標準で備わっている。
whenever
cron
の設定を、ruby
の簡単な文法で扱えるようにしたライブラリがwhenever
。
whenever
を使えばcron
に対して命令を行うcrontab
に記述する内容をruby
言語で書けるようになる。
つまりcron
の設定を自分で書く代わりに、このgem
を使用すると比較的簡単に定期実行ができる。
wheneverでcronを編集
まずはwhenever
をインストールする。
Gemfileに記入後、bundle install
を実行。
gem 'whenever', require: false
※require: false
はRails
の内部でwhenever
を使うわけではないため、Rails
の実行時に読み込まないようにするため。
インストール後、下記を実行することでschedule.rb
というファイルが生成されるので、ここに定期実行させたいタスクやその頻度などを記述してcron
を編集する。
$ bundle exec wheneverize .
[add] writing `./config/schedule.rb'
[done] wheneverized!
[done] wheneverized!
が出ればOK。
schedule.rb
に記述していく。
# Rails.rootを使用するために必要
require File.expand_path(File.dirname(__FILE__) + '/environment')
# cronを実行する環境変数
rails_env = ENV['RAILS_ENV'] || :development
# cronを実行する環境変数をセット
set :environment, rails_env
# cronのログの吐き出し場所
set :output, "#{Rails.root}/log/cron.log"
#定期実行したい処理を記入
every :hour do
rake 'article_state:update_article_state'
end
今回は定期実行の箇所に、rakeタスク
の記事ステータスが1時間ごとに変更される記載がしてある。
また、rakeタスク
実行時にputs
などで文字列をログに出したい場合は、rakeタスク
はデフォルトで--slientオプション
付きで登録されるため、job_type
の再定義を行う必要がある。
job_typeとは
whenever
では次の4つのjob_type
と呼ばれる4種類の処理を行うことができ、時間も好きに設定できる。
job_type | 実行内容 |
---|---|
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
を作成することもでき、your_job_name
の部分は自由に命名できる。
job_type :your_job_name, 'cd :path && export PATH=/usr/local/bin:$PATH &&
:environment_variable=:environment bundle exec rake :task --silent :output'
every 2.hours do
your_job_name "sample_task"
end
crontabを実行
whenever
でcron
の内容を記述したので、このcron
を実行させるためにcrontab
コマンドを打つ。
# wheneverの設定更新
$ bundle exec whenever --update-crontab
# 設定内容にエラーがないか確認
$ bundle exec whenever
# 設定されているcronを見る
$ crontab -l
# crontabの設定削除(定期実行を辞めたいとき)
$ bundle exec whenever --clear-crontab
参考記事
Railsでwheneverを使ってcronを設定する
gem whenever を使って Rails で定時処理を作る