こんにちは!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.rbにset :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サイトの定期的なバックアップ
- メールマガジンの日時指定配信
などができます。使いこなして様々なサービスが作れるといいですね。
コメント