プログラミング技術

本サイトはプロモーションが含まれています。

【Docker x Rails】gem wheneverで簡単cron設定

railsでcronの設定(gem whenever)
初心者さん
定期的にバッチを実行したい。

今回は、wheneverというgemを使ってcronの設定をするという内容です。

毎日、決まった時間に何か処理を実行したい、1週間に1度、集計するプログラムを実行したい。こんな時にはcronの設定をすると簡単に自動で実行できます。

▼この記事では、以下の点について解説していきます。

  1. gem wheneverとは
  2. cronの設定
  3. 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を使うと簡単に実行ができますね。

例えば、毎日行う処理を寝ている時間帯に実行して朝起きた時には終了させておくとか、寝ている時間帯にスクレイピングをしてデータを取得してくるとか活用できますね。

今回は備忘録として簡単な方法で実行して書き残したのですが、実際はもっと設定やコマンドもいろいろあるので、試してみてください。

-プログラミング技術