LoginSignup
18
12

More than 1 year has passed since last update.

【Rails】wheneverでcronを設定

Last updated at Posted at 2022-02-17

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: falseRailsの内部でwheneverを使うわけではないため、Railsの実行時に読み込まないようにするため。

インストール後、下記を実行することでschedule.rbというファイルが生成されるので、ここに定期実行させたいタスクやその頻度などを記述してcronを編集する。

$ bundle exec wheneverize .

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

[done] wheneverized!が出ればOK。
schedule.rbに記述していく。

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を実行

whenevercronの内容を記述したので、この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 で定時処理を作る

18
12
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
18
12