はじめに
何らかの処理を定期的に実行したいという場合、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」を使っていただければと思います。