STUDY MEMO

学習のメモ書き

<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

引用・参考文献

デプロイとはとは何?Weblio辞書

GitHub - javan/whenever: Cron jobs in Ruby

cronとは - IT用語辞典 e-Words

Rails のコマンドラインツール - Railsガイド

Railsでwheneverを使ってcronを設定する - Qiita

gemのwheneverを導入してみた - まっしろけっけ

バッチ処理(一括処理)とは - IT用語辞典 e-Words

Ruby on Rails - Gemfileに書かれるrequire => false とはどういう意味でしょうか?|teratail

railsを起動するとgemはどのように読み込まれてんのか - 雑日記

https://wa3.i-3-i.info/word11220.html