今回は、wheneverというgemを使ってcronの設定をするという内容です。
毎日、決まった時間に何か処理を実行したい、1週間に1度、集計するプログラムを実行したい。こんな時にはcronの設定をすると簡単に自動で実行できます。
▼この記事では、以下の点について解説していきます。
- gem wheneverとは
- cronの設定
- cron定期実行する方法
備忘録も兼ねて、gem wheneverを使ったcronの設定をしていきます。
wheneverというgemについて
cronの設定を簡単にできるライブラリとでも理解しておく。そしてcronは定期的な実行を行うための機能です。
wheneverをインストールする
gem 'whenever', require: false
Gemfileに以下を追加して、bundle installします。require: falseは、本体に必要ないので。。。調べてください。
僕はDockerを使っているので以下のコマンドでインストールします。(apiはサービス名)
docker-compose run --rm api bundle install
コマンドで初期設定をする
以下のコマンドで初期設定の準備をします。
docker-compose run --rm api bundle exec wheneverize .
といっても「config/schedule.rb」ができるだけです。このファイルにスケジュールや実行する内容を記述していきます。1分おきにバッチを実行するよう設定してみます。
set :output, 'log/execute.log' set :environment, :development ENV.each { |k, v| env(k, v) } # 1分おきに以下のrunnerを実行 every 1.minute do runner 'Batch::MinuteExecute.outputText' end
スケジュール時間は状況に合わせて設定してみる
定期実行する時間もいろいろと設定可能です。
# 2時間おきに実行 every 2.hours do # 処理 end # 毎日pm3:00に実行 every 1.day, at: '3:00 pm' do # 処理 end # 日曜日の11時に実行 every :sunday, at: '11:00 am' do # 処理 end
cronで実行するバッチを作成
lib/batch配下にcronで動かすバッチを作成します。
Batchファイルを作成
今回実行するバッチは、以下のような感じで単にコメントを出力するだけです。
class Batch::MinuteExecute def self.outputText puts DateTime.now puts 'バッチから出力しています。' end end
作成したBatchを実行してみる
まずはバッチが動作するか、実行してみる。以下のように動作しているのが確認できました。
% docker-compose run --rm api bundle exec rails runner Batch::MinuteExecute.outputText Running via Spring preloader in process 28 2021-11-13T19:12:10+09:00 バッチから出力しています。
cronで定期実行してみる
では、最後にcronを動かして定期実行していきます。
crontabに設定を反映させる
cronを管理するcrontabに設定を反映させるコマンド。
# dockerに入る docker exec -it backend_api_1 bash # crontabに設定を反映させる bundle exec whenever --update-crontab
実行してログファイルを確認
実行してみます。
# 実行 service cron start
以下のように1分おきに、ログファイルに書き込まれていきます。
2021-11-13T19:29:02+09:00 バッチから出力しています。 Running via Spring preloader in process 493 2021-11-13T19:30:01+09:00 バッチから出力しています。 Running via Spring preloader in process 509 2021-11-13T19:31:01+09:00 バッチから出力しています。 Running via Spring preloader in process 525
確認できたら、停止しておきます。
service cron stop
gem wheneverで簡単cron設定まとめ
定期実行する場合は、gem wheneverを使うと簡単に実行ができますね。
例えば、毎日行う処理を寝ている時間帯に実行して朝起きた時には終了させておくとか、寝ている時間帯にスクレイピングをしてデータを取得してくるとか活用できますね。
今回は備忘録として簡単な方法で実行して書き残したのですが、実際はもっと設定やコマンドもいろいろあるので、試してみてください。