【Rails】Rubyでcronジョブを記述できるGem「whenever」の導入・使用方法

はじめに

何らかの処理を定期的に実行したいという場合、UNIX/Linuxに搭載されているcron(クーロン)という機能を使うことができます。

cronの設定例

$ crontab -l
0 1 * * * bundle exec rake articles:check_status

この例は「毎日1:00にarticles:check_statusというRakeタスクを定期実行する」という意味です。このcronの設定一つ一つをcronジョブといいます。

「whenever」というGemを使えば、Rubyでこのcronジョブを定義・設定することができます。cronジョブを定義したRubyファイルを特定のコードベースにコミットすることで、cronジョブの変更をGitで管理できるようになります。

wheneverの導入・使用方法

導入

Gemfileに以下を追記しbundle installを行います。

「whenever」はRailsアプリケーションの中で使うわけではないため、require: falseオプションを指定します。

Gemfile

gem 'whenever', require: false

Gemがインストールできたら、次に以下のコマンドを実行します。

$ bundle exec wheneverize .

するとconfig/ディレクトリ配下にschedule.rbというファイルが作成されます。このファイルにcronジョブを定義していくことになります。

使用方法

ではさっそくschedule.rbにcronジョブを定義していきます。

config/schedule.rb

every 1.day, at: '1:00 am' do
  rake 'articles:check_status'
end

everyメソッドの後に定期実行したい周期を指定します。この周期はいろいろな書き方ができます。

書き方 意味
1.minite,:minute/N.minutes 毎分/N分毎
1.hour,:hour/N.hours 毎時/N時間毎
1.day,:day/N.days 毎日/N日毎 ※注意
1.month,:month/N.months 毎月/N月毎
1.year,:year/N.years 毎年/N年毎
:sunday...:saturday 各曜日毎
:weekday/:weekend 平日/週末
:reboot 再起動時
'0 1 * * *' cronの記述方法

※注意

例えば5日に一度だけ実行したい処理があったとして、周期に5.daysと記述したとします。すると、毎月1日を起点にして5日毎に実行されることになります。つまり、1日、6日、11日、16日、21日、26日の6日です。

その次に実行されるのは翌月の1日です。30日までの月であれば問題ありませんが、29日までの月であれば4日後、31日までの月であれば6日後に実行されることになってしまいます。

これはcronの仕様なのでどうしようもありません。一応、ちゃんとN日毎に実行する記述方法があるようなので、どうしても必要な場合は「cron 2日毎」とかで調べてみてください。


周期の後のat:で時刻を指定します。周期の中で複数回実行したい場合、配列で時刻を列挙します。

config/schedule.rb

every 1.day, at: ['1:00 am', '1:00 pm'] do
  rake 'articles:check_status'
end

cronジョブが定義できたら以下のコマンドを実行して意図通りのcronジョブになっているか確認します。

$ bundle exec whenever
0 1 * * * /bin/bash -l -c 'cd /path/to/app && RAILS_ENV=production bundle exec rake articles:check_status --silent'

問題ないようであれば以下のコマンドを実行してcrontabに登録します。

$ bundle exec whenever --update-crontab

以下のコマンドを実行してちゃんと登録できているか確認します。

$ crontab -l
0 1 * * * /bin/bash -l -c 'cd /path/to/app && RAILS_ENV=production bundle exec rake articles:check_status --silent'

まとめ

Rubyでcronジョブを記述できるGem「whenever」の導入・使用方法についてまとめてみました。

「whenever」を使用することで、Railsアプリケーションとして定期実行する処理をRubyファイルで管理することができるようになります。また、Capistranoと統合することでデプロイ時に自動でcronの設定を行うようにすることもできます。

本記事を参考にして「whenever」を使っていただければと思います。

関連記事

【Rails】Paranoiaを使用した論理削除(ソフトデリート)
# はじめに Paranoiaは、Railsアプリケーションで論理削除(ソフトデリート)を実現するためのGemです。 論理削除は、データベースのレコードを物理的に削除するのではなく、削除フラグを設定することで「削除済み」とみなす方法です。こ [...]
2024年7月20日 21:33
【Rails】activerecord-multi-tenantを使用したマルチテナントアプリケーションの作成
# はじめに マルチテナントアプリケーションでは、複数の顧客(テナント)が同じアプリケーションを利用するため、データの分離が必要です。 activerecord-multi-tenantは、このようなマルチテナント環境をサポートするための便 [...]
2024年7月18日 16:50
【Rails】RubyとRailsにおけるattr_reader, attr_writer, attr_accessorの概念と使用方法
# はじめに RubyとRailsの開発において、`attr_reader`,`attr_writer`,`attr_accessor`は非常に便利なメソッドです。これらは、クラス内でインスタンス変数に対するゲッターおよびセッターメソッドを簡単に [...]
2024年7月17日 18:11
【Rails】RubyとRailsにおけるyieldの概念と使用方法
# はじめに RubyとRailsにおける`yield`は、メソッドやテンプレートの中で動的にコードブロックを実行する能力を提供し、これによってコードの再利用性と拡張性が大幅に向上します。本記事では、RubyとRailsにおける`yield`の概 [...]
2024年7月17日 13:15
【Rails】AASMを使用してオブジェクトの状態遷移を効率的に管理
# はじめに Railsアプリケーションにおいて、オブジェクトの状態管理は重要な課題の一つです。AASM (Acts As State Machine) gemは、複雑な状態遷移を効率的に管理します。本記事では、AASMの基本的な使い方を解説して [...]
2024年7月16日 18:00
【Rails】RSpec + Swagger + rswagでアプリケーションのAPIをテストおよびドキュメント化する方法
# はじめに Railsアプリケーションの開発において、APIのテストとドキュメント化は重要な要素です。 RSpecはテストフレームワークとして広く利用されており、SwaggerはAPIの設計とドキュメント化を支援します。これらを統合するr [...]
2024年7月16日 14:27
【Rails】mailcatcherを使用して開発環境でメール送信をテストする方法
# はじめに mailcatcherは、開発環境でのメール送信をキャプチャするためのツールです。ローカルで送信されたメールをブラウザ上で簡単に確認できるようにします。mailcatcherをRailsアプリケーションで使用する方法について説明しま [...]
2024年7月15日 16:37
【Rails】impressionistを使用してページビューやクリック数を追跡する方法
# はじめに impressionist Gemを使用してRailsアプリケーションでページビューやクリック数を追跡する方法について説明します。 # 実装方法 ## impressionist Gemのインストール まず、impre [...]
2024年7月15日 14:18