【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】RSpecを使った自動テスト《システムスペック編》
# はじめに Railsでアプリケーションを開発する際、品質を担保するためにテストは欠かせません。その中でも、RSpecは多くの開発者に愛用されているテストフレームワークです。 今回は、RSpecを使ったRailsアプリケーションのテスト方 [...]
2024年7月11日 17:07
【Rails】RSpecを使った自動テスト《リクエストスペック編》
# はじめに Railsでアプリケーションを開発する際、品質を担保するためにテストは欠かせません。その中でも、RSpecは多くの開発者に愛用されているテストフレームワークです。 今回は、RSpecを使ったRailsアプリケーションのテスト方 [...]
2024年7月11日 16:06
【Rails】RSpecを使った自動テスト《コントローラースペック編》
# はじめに Railsでアプリケーションを開発する際、品質を担保するためにテストは欠かせません。その中でも、RSpecは多くの開発者に愛用されているテストフレームワークです。 今回は、RSpecを使ったRailsアプリケーションのテスト方 [...]
2024年7月11日 15:39
【Rails】RSpecを使った自動テスト《モデルスペック編》
# はじめに Railsでアプリケーションを開発する際、品質を担保するためにテストは欠かせません。その中でも、RSpecは多くの開発者に愛用されているテストフレームワークです。 今回は、RSpecを使ったRailsアプリケーションのテスト方 [...]
2024年7月11日 11:50
【Rails】RSpecを使った自動テスト《基本編》
# はじめに Railsでアプリケーションを開発する際、品質を担保するためにテストは欠かせません。その中でも、RSpecは多くの開発者に愛用されているテストフレームワークです。 今回は、RSpecを使ったRailsアプリケーションのテスト方 [...]
2024年7月10日 17:49
【Rails】デザインパターン「Concern」の基本情報と実装方法
# はじめに Ruby on RailsなどのMVCフレームワークで構築したWebシステムにはアンチパターンというものが存在します。システム開発におけるアンチパターンとは、避けるべき悪い設計や実装方法のことを指します。 MVCフレームワーク [...]
2024年7月10日 13:32
【Rails】デザインパターン「Form Object」の基本情報と実装方法
# はじめに Ruby on RailsなどのMVCフレームワークで構築したWebシステムにはアンチパターンというものが存在します。システム開発におけるアンチパターンとは、避けるべき悪い設計や実装方法のことを指します。 MVCフレームワーク [...]
2024年7月6日 22:50
【Rails】デザインパターン「Service Object」の基本情報と実装方法
# はじめに Ruby on RailsなどのMVCフレームワークで構築したWebシステムにはアンチパターンというものが存在します。システム開発におけるアンチパターンとは、避けるべき悪い設計や実装方法のことを指します。 MVCフレームワーク [...]
2024年7月6日 19:59