Wheneverは導入が超簡単なcrontab管理ライブラリGemです![Rails 4.2 x Ruby 2.3]

wheneverはcrontab管理ライブラリです。導入はすごく簡単ですし、RailsやCapistranoとの連携もスムーズで楽ちんです! 定期実行するような処理がある場合はぜひご検討ください!

javan/whenever · GitHub

(2016/01/10) Rails 4.2 x Ruby 2.3の動作確認。記事をリファクタリング


Gemのインストール

いつ戻おりGemfileに以下を追加して、bundle installを実行してください。

1
2
3
# Gemfile
# crontab管理
gem 'whenever', require: false

whenever設定ファイルschedule.rbを作成

次のコマンドを実行してconfig/schedule.rb

1
2
3
$ bundle exec wheneverize .
> [add] writing `./config/schedule.rb'
> [done] wheneverized! #<= 成功

wheneverのコマンドの解説

wheneverでは次の4つをスケジューリングできます。

command: bashコマンド実行
rake: rakeタスク実行
runner: Rails内のメソッド実行
script: scriptの実行

設定の具体例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# config/schedule.rb
# 出力先のログファイルの指定
set :output, 'log/crontab.log'
# ジョブの実行環境の指定
set :environment, :production
# 3時間毎に実行するスケジューリング
every 3.hours do
runner 'MyModel.some_process'
rake 'my:rake:task'
command '/usr/bin/my_great_command'
end
# 毎日 am4:30のスケジューリング
every 1.day, at: '4:30 am' do
runner 'MyModel.task_to_run_at_four_thirty_in_the_morning'
end
# 一時間毎のスケジューリング
every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot
runner 'SomeModel.ladeeda'
end
# 日曜日のpm12時にスケジューリング
every :sunday, at: '12pm' do # Use any day of the week or :weekend, :weekday
runner 'Task.do_something_great'
end
# crontab型の設定「分」「時」「日」「月」「曜日」
# 毎月27日〜31日まで0:00に実行
every '0 0 27-31 * * ' do
command 'echo 'you can use raw cron syntax too''
end
# 6-24時まで3時間おきに実行
work_hour_per_two = (6..24).select{ |_| _%3 == 0 }.map {|_| "#{_}:00" }
every 1.day, at: work_hour_per_two do
rake 'my:rake:task'
end

Corntabへの設定

crontabに設定する際のコマンドは次のとおり。

1
2
3
4
5
# wheneverの設定更新
RAILS_ENV=development bundle exec whenever --update-crontab
# crontabの設定削除
RAILS_ENV=development bundle exec whenever --clear-crontab

詳しい設定方法はGitHubの公式ページへ。

javan/whenever · GitHub

Capistranoとの連携

Capistranoについての詳しい記事は、『Capistrano 3系でRails4.1のデプロイ』です。興味があればぜひご一読ください。

Capistrano/wheneverの基本的な連携

wheneverの特徴のひとつとして、Deployプロセスの自動化をしてくれるGem Capistranoと簡単に連携できる点があります。

設定方法は、まず以下をCapfileに追記。

1
require 'whenever/capistrano'

続いて、config/deploy.rbに以下を追記。

1
set :whenever_identifier, ->{ "#{fetch(:application)}_#{fetch(:stage)}" }

あとはcap deployのたびにcrontabをアプデートしてくれます。

Capistrano/wheneverで環境ごとに設定を変更したい場合

次の記事を見ながら設定すればできる気がします^^

参考リンク

CapistranoでWhenever | ひげろぐ

capistrano+wheneverで簡単cron管理-logiclogic’s blog | logiclogic’s blog

変更来歴

(12/12/24 xx:xx) 新規作成

(13/01/07 18:35)「補足:別ファイルにローカルタスク用の設定を書く」を追加

(13/01/08 23:50)「補足:複数環境でwheneverを使いたい場合。..」を修正

(14/04/23 22:20) Rails 4.1対応、全面書き直し!

(14/07/10 20:15) 環境ごとにcronの設定を切り替える方法を追記

(14/11/02 15:25) Capistranoで環境ごとに処理を振り分ける方法がrvmのパスが変わってうまく動かなくなったので一度削除

(15/11/15 17:15) wheneverコマンドの記述を追加

(16/01/10 14:40) bundle execを追加。Rails 4.2 x Ruby 2.3.0動作確認