酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

Wheneverは導入が超簡単なcrontab管理ライブラリGemです![Rails4.2 X Ruby2.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で環境ごとに設定を変更したい場合

以下の記事を見ながら設定すれば出来る気がします^

Special Thanks

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) Rails4.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 動作確認

おすすめの書籍