【Rails】whenever gemを使用した定期バッチ処理

rails

こんにちは!tekute-kuです。

今回は定期的にタスク処理をしてくれる方法を紹介していきたいと思います。

記事を書いた目的

Railsアプリの開発時に定期にメール配信をする仕様を実装する際にどうやってやればいいか調べたため、備忘録として記録します。この記事がどなたかの役に立てば幸いです。

事前知識

まずは定期的にタスク処理をしてくれる実装の予備知識をここで押さえておきましょう。

whenever gem

まずはRailsで定期的なタスク処理の実装にはwhenever gemのインストールが必要です。ではwhenever gemとは何でしょうか。

whenever gemとはcronの設定をRubyの簡単な文法で扱えるようにしたライブラリのことです。

ですがまた新しい用語cronが出てきました。こちらについても用語を理解しておいた方が良さそうですね。

cron(クロン)

cron(クロン)とはUNIX系(Linuxなど)に入っているプログラムの一つ事前に「この時間になったらこのプログラムを動かして」と指示を出しておけば時間になったら自動で指示されたプログラムを実行してくれるプログラムのことです。

そしてこの「この時間になったらこのプログラムを動かして」のcronに指示を出すコマンドをcrontabコマンドといいます

またこのような定期でまとめてやってくれる処理をバッチ処理といいます。

なお先ほど確認したwhenever gemの英語のwheneverの意味は「いつでも」ですので大体そのままの意味ですね。

用語の確認ができましたので実装の手順を確認していきましょう。

実装の手順

whenever gemのインストール

まずはwhenever gemのインストールです。

Gemfileに入力します。

gem'whenever',require: false

そしてインストールします。

bundle install

これでwhenever gemがインストールされました。

schedule.rbを生成して処理を記入

whenever gemがインストールされたらコマンドでconfig/schedule.rbを生成します。

bundle exec wheneverize .

[add] writing `./config/schedule.rb'

[done] wheneverized!

これでconfig/schedule.rbが生成されました。このschedule.rbファイルはwheneverの認定ファイルでこちらに記入した内容がバッチ処理されます。

続いてschedule.rbを開いてバッチ処理を記入していきます。

# Use this file to easily define all of your cron jobs.
#
# It's helpful, but not entirely necessary to understand cron before proceeding.
# http://en.wikipedia.org/wiki/Cron

# Example:

env :PATH, ENV['PATH']
set :output, "log/cron.log" #ログファイルの出力先を指定
set :environment, :development

every 1.days, at: '6:00 pm' do

# EveryoneMailerのremind_mail_to_everyoneメソッド実行
runner "EveryoneMailer.remind_mail_to_everyone"
end

# Learn more: http://github.com/javan/whenever

上の記述では、1日一回午後6時に実行するようになっています。

他の例は以下をご覧ください。

every 12.hours do #12時間おきに実行

every 10.minutes do #10分おきに実行

every :monday, at: ['4:30 am', '6:00 pm'] do #毎週月曜日午前4時、午後6時に実行

every 1.month, at: 'start of the month at 0am' do #毎月1日0時に実行

そして一段下にはどのメソッドを実行するかが記入されています。私の場合だと定期にメールが配信されるようにメソッドを指定しています。

また上の記述ではRails内のメソッドを実行する指定がされていますが、他にも指定ができますので以下をご参照ください。

runner: Rails内のメソッド実行

command: bashコマンド実行

script: scriptの実行

rake: rakeタスクを実行

cronにバッチ処理を反映させる

ここまでできたら、あとはcronにバッチ処理を反映させるだけです。

whenever gemではschedule.rbに記述した内容(バッチ処理)がcrontabに反映される仕組みになっています。反映させる方法は以下のコマンドをターミナルで入力します。

bundle exec whenever --update-crontab
[write] crontab file updated

これで反映されました。

反映されているかどうかを確認するにはcrontabコマンドをターミナルで入力します。

crontab -l

この結果、処理内容(今回の場合はEveryoneMailer.remind_mail_to_everyone)

が出力されていれば、成功です。

処理が実行できているかを確認する

実際に処理ができているかどうかを見るにはlogファイルを確認します。

先ほど、schedule.rbset :output, "log/cron.log"

と記入しましたがこれはもし機能が正常に作動していてバッチ処理が正確に実行できていれば、このlogファイルが生成されて以下のような記述がされます。

log/cron.log

Running via Spring preloader in process xxxx

Running via Spring preloader in process yyyy

cronのデータ削除

もし定期のバッチ処理を停止したいのであればcronからデータを削除しましょう。

bundle exec whenever --clear-crontab
[write] crontab file

これでデータの削除ができたのでバッチ処理は停止されました。

まとめ

  • Railsでバッチ処理をしたい場合はwhenever gemを導入する
  • 定期の処理を実行するプログラムはcron(クロン)である
  • crontabコマンドでcronを操作する
  • whenever gemはconfig/schedule.rbにバッチ処理を記述して実行する

バッチ処理を使えば

  • 定期的なファイル転送 → Webサイトを楽に更新する
  • Webサイトの定期的なバックアップ
  • メールマガジンの日時指定配信

などができます。使いこなして様々なサービスが作れるといいですね。

コメント