<Ruby on Rails> Wheneverについて
wheneverとは?
wheneverの公式では以下のように記載されている。
Whenever is a Ruby gem that provides a clear syntax for writing and deploying cron jobs.
Wheneverは、cronを書いたりデプロイするためのクリアな構文を提供するRuby gem、とのこと。
wheneverでバッチを回すという表現がされる。
デプロイとは?
主にネットワークを通じて提供されるWebアプリケーションなどにおいて、システムを利用可能な状態にすること。
cronとは?
常駐プログラム(デーモン)の一種で、利用者の設定したスケジュールに従って指定されたプログラムを定期的に起動してくれるもの。
バッチ処理とは?
複数のプログラムからなる作業において、あらかじめ一連の手順を登録しておき、まとめて連続的に実行する方式。
または、一定期間や一定量ごとにデータをまとめて一括して処理する方式。
使い方
インストール
Gemfileに以下のように記載し、bundle installする。
gem 'whenever', require: false
schedule.rbファイルを作成
以下のコマンドを実行することでconfig/schedule.rbが作成される。
$ bundle exec wheneverize .
schedule.rbファイルの編集
例えば、1時間ごとに実行したい場合はeveryの後に:hourと記載する。
他にも:day、:month、:year、:reboot(再起動)などのショートカットがある。
do ~ endのなかに、実行したいrakeタスクファイルを記載する(runnerやcommandなどの他の記載方法もある)。
# Rails.rootを使用するために必要。config/environment.rbを取り込む。 # 記載しないとNameError: uninitialized constant #<Class:#<Whenever::JobList:...>>::Railsエラーが出る。 require File.expand_path(File.dirname(__FILE__) + '/environment') # cronを実行する環境変数。 # ENV['RAILS_ENV'] = nilの時:developmentを代入。 rails_env = ENV['RAILS_ENV'] || :development # cronを実行する環境変数をセット set :environment, rails_env # cronのログの吐き出し場所 set :output, "#{Rails.root}/log/cron.log" # 1時間ごとに指定のrakeタスクを実行 every :hour do rake "rakeタスクのnameplace:task名" end
File.expand_path(...)は、/Users/ユーザー名/workspace/726_noguchime_runteq_learning_advancedを指し、File.dirname(FILE)はカレントディレクトリを指す。
runnerとは?
コマンドラインツール。非対話的にRailsの文脈でRubyのコードを実行することができる。
何故requireするの?
gemfileにrequire :falseと設定しているため、個別に指定が必要となる。
参考文献では、上記のように設定するとRailsアプリ本体ではそのgemは呼ばれないため、スクリプトの方では手動でrequireする、とある。
Railsアプリのデータを触るバッチ(一連の処理)スクリプト(裏側で行われる処理)で、バッチスクリプト(裏側の一連の処理)でしか使わないgemの場合設定するようだ。
schedule.rbを確認
scheduldule.rbファイルをcron構文に変換したものを表示する(crontabファイルを読み書きしない)とき、以下のコマンドを使用。
$ bundle exec whenever
crontabファイルに書き込む
$ bundle exec whenever --update-crontab
消去するときは以下のコマンドを使用
$ bundle exec whenever --clear-crontab
引用・参考文献
GitHub - javan/whenever: Cron jobs in Ruby
Railsでwheneverを使ってcronを設定する - Qiita
バッチ処理(一括処理)とは - IT用語辞典 e-Words
Ruby on Rails - Gemfileに書かれるrequire => false とはどういう意味でしょうか?|teratail