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

プログラミング

プログラミングスクールの学習に関する不満は、受講者が求めている学習の難易度とスクール側が提供している内容がマッチしないことで起こりやすいです。

  1. 難易度は合っているか(わかりやすい → 内容が簡単過ぎないか)
  2. 受講の形式(講義、動画、模写、テキスト)は合っているか
  3. 受講料は、適切か(安いけど質は問題ない?)

不満が出やすい上記の点をしっかり考えて選択してみてください。選べないという方はお気軽にお問い合わせください。アドバイスくらいはできます。

定期的にバッチを実行したい。

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

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

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

  1. gem wheneverとは
  2. cronの設定
  3. cron定期実行する方法

備忘録も兼ねて、gem wheneverを使ったcronの設定をしていきます。

目次

  1. wheneverというgemについて
    • wheneverをインストールする
    • コマンドで初期設定をする
    • スケジュール時間は状況に合わせて設定してみる
  2. cronで実行するバッチを作成
    • Batchファイルを作成
    • 作成したBatchを実行してみる
  3. cronで定期実行してみる
    • crontabに設定を反映させる
    • 実行してログファイルを確認
  4. 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を使うと簡単に実行ができますね。

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

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

当サイトで申込の多いプログラミングスクール

TechAcademyの無料体験
マンツーマンでオリジナルアプリの作成ができるテックアカデミーは人気が高いプログラミングスクール。
Webエンジニア輩出実績トップクラスの【ポテパンキャンプ】
転職に強く本気でエンジニア転職を目指す人におすすめ。難易度が高いため身につくスキルも高く企業からの評価も高いのが特徴。
CodeCamp無料体験
講師を選択できるのが特徴のコードキャンプ。チャットでの質問ができないと言われていますが、オプションでチャットサポートを選択できるのがあまり知られていない。講師の評判が高いため質問しながらどんどん進みたい人向け。