プログラミンでの醍醐味はやはり自動化処理ではないでしょうか?
定型的な処理はできる限り自動的に実行できるようにして、問題が起きたときだけ確認できるようにしておくと、長い目で見て多くの時間を節約することにも繋がります。
この記事では、Ruby on RailsとRailsのrunner、whenever(crontab)を使って、定期的に処理を実行するサンプルを記載します。
バッチ処理のコードを実装する
まずは、定期的に行いたい処理を定義し、コマンドで実行できるようにします。
Railsには、大きく、「runner」と「task」という2種類のコマンドでバッチ処理を書くことが出来ます。今回は「runner」を使用します。
まずは、Batchクラスのファイルを用意します。
「runner」の場合は、ファイルの格納先は柔軟に決めることができるのですが、今回はバッチ処理として実装するので、libフォルダ配下にbatchフォルダを作成し、その配下に、test_batch.rbを実装することにします。
# lig/batch/test_batch.rb
class Batch::TestBatch
def self.testBatch
puts '--- Batch::TestBatch.testBatch ---'
sns = SlackNotificationService.new
channel = "#channel"
title = "test"
body = "test"
sns.send_notification(channel: channel, title: title, body: body)
end
end
実行完了を確認するために、今回は「puts」と「slack通知」の処理を記述します。適宜、各自の要件に併せて変更してください。動作確認のために実装するだけであれば、「puts」で標準出力するだけでも十分です。
コマンドで実行してみる
batchファイルの実装が完了したら、次は手動で実行してみます。
bundle exec rails runner Batch::TestBatch.testBatch
標準出力やslackへの通知が届いていれば動作確認完了です。
wheneverの実装
次に定期実行するためのモジュール「whenever」を導入します。
wheneverとは、linuxサーバーでのcrontabの設定をrubyで簡単に行える、ラッパーライブラリです。
wheneverの導入
# Gemfile
gem 'whenever'
bundle install
wheneverの初期化
ターミナルで以下を実行します。
bundle exec wheneverize .
[add] writing './config/schedule.rb'
[done] wheneverized!
config配下にschedule.rbが作成されます。
scheduole.rbの設定
先程実装したバッチ処理を毎分実行するようにしてみます。
# schedule.rb
every 1.minute do
runner "Batch::TestBatch.testBatch"
end
schedule.rbの記述方法の詳細は、wheneverの公式ドキュメントを参照してください。
GitHub whenever
crontabの設定
schedule.rbの設定が完了したら、次はcrontabに反映させます。
crontabに設定されている内容を確認
crontab -l
現時点では何も設定していないので、何も表示されないことを確認します。
処理の確認
bundle exec whenever
このコマンドを実行することで、crontabに反映される内容が表示されます。
crontabへの反映
bundle exec whenever —-update-crontab
“bundle exec whenever”で確認した内容をcrontabに反映します。
この状態で、再度
crontab -l
を実行してみましょう。
処理がcrontabに反映されていることがわかります。
今回は毎分の処理実行としているので、1分ごとに標準出力されていたり、slackへの通知が届いていたりすると思います。
crontabに設定した内容を削除する
bundle exec whenever —-clear-crontab
crontabを手で修正する
crontab -e
これでvimで手動で修正することも可能です。