Help us understand the problem. What is going on with this article?

Railsでwheneverを使ってcronを設定する

概要

  • Railsでcronを管理するためのgem wheneverの使い方
  • capistranoでwheneverをセットする方法

gemインストール

Gemfileに追記

Gemfile
# cron
gem 'whenever', require: false
$ bundle install --path vendor/bundle

初期化

下記コマンドで設定ファイルを作成される

$ bundle exec wheneverize .

[add] writing `./config/schedule.rb'
[done] wheneverized!

wheneverの設定

$ vi config/schedule.rb
config/schedule.rb
# Rails.rootを使用するために必要
require File.expand_path(File.dirname(__FILE__) + "/environment")
# cronを実行する環境変数
rails_env = ENV['RAILS_ENV'] || :development
# cronを実行する環境変数をセット
set :environment, rails_env
# cronのログの吐き出し場所
set :output, "#{Rails.root}/log/cron.log"

# stagingのみで実行
if rails_env.to_sym != :development
  # clear cache
  every 10.minutes do
    begin
      rake 'sample_task:all', :environment_variable => "RAILS_ENV", :environment => "development"
    rescue => e
      Rails.logger.error("aborted rake task")
      raise e
    end
  end
end

第1引数は :task としてセットされる。
その他の引数は省略可能だが、その場合は下記のようにデフォルト値がセットされる。

変数 デフォルト値
:path wheneverの実行ディレクトリのパス
:environment_variable RAILS_ENV
:environment production

job_type

自分でjob_typeを作成することもできる。
your_job_name の部分は自由に命名できる。

config/schedule.rb
job_type :your_job_name, 'cd :path && export PATH=/usr/local/bin:$PATH && 
  :environment_variable=:environment bundle exec rake :task --silent :output'

every 2.hours do
  your_job_name "sample_task"
end

実際に実行されるコマンド

$ cd /project && export PATH=/usr/local/bin:$PATH && \
    RAILS_ENV=production bundle exec rake :task --silent 

cronに反映する際のコマンド

設定内容にエラーがないか確認

$ bundle exec whenever 

設定されているcronを見る

$ crontab -l

cronにデータを反映

$ bundle exec whenever --update-crontab 

cronからデータを削除

$ bundle exec whenever --clear-crontab

その他

下記コメントアウト外の記述には、削除も更新も、wheneverコマンドでは影響しない

# Begin Whenever generated tasks for: /vagrant/project/config/schedule.rb

# End Whenever generated tasks for: /vagrant/project/config/schedule.rb

Begin Whenever generated tasks for: が、cronとプロジェクトを関連づけているので、update、clearともに、該当のプロジェクトのものしか影響しない。

/bin/bash -l で実行されるので、 .bash_profile は読み込まれる。

crontab

# Begin Whenever generated tasks for: /vagrant/project/releases/20170301131348/config/schedule.rb
0,10,20,30,40,50 * * * * /bin/bash -l -c 'cd /vagrant/project/releases/20170301131348 && RAILS_ENV=staging bundle exec rake sample_task:all --silent >> /vagrant/project/releases/20170301131348/log/cron.log 2>&1'

# End Whenever generated tasks for: /vagrant/project/releases/20170301131348/config/schedule.rb

capistranoでwheneverをセットする方法

Gemfile

capistranoサーバーにもwheneverのインストールが必要

gem 'whenever', :require => false

Capfile

require 'whenever/capistrano'

config/deploy.rb

set :whenever_roles,        ->{ :app }

その他のオプションは、下記のGithubのコードを参照。

Github: javan/whenever

namespace :load do
  task :defaults do
    set :whenever_roles,        ->{ :db }
    set :whenever_command,      ->{ [:bundle, :exec, :whenever] }
    set :whenever_command_environment_variables, ->{ { rails_env: fetch(:whenever_environment) } }
    set :whenever_identifier,   ->{ fetch :application }
    set :whenever_environment,  ->{ fetch :rails_env, fetch(:stage, "production") }
    set :whenever_variables,    ->{ "environment=#{fetch :whenever_environment}" }
    set :whenever_update_flags, ->{ "--update-crontab #{fetch :whenever_identifier} --set #{fetch :whenever_variables}" }
    set :whenever_clear_flags,  ->{ "--clear-crontab #{fetch :whenever_identifier}" }
  end
end

参考

Esfahan
WEB系出身。現在はビッグデータの基盤構築、ETLなどがメイン。 / YouTubeで料理チャンネルやってます → https://www.youtube.com/channel/UCDnYBh2TtUAfQ0Z-tl0jTyw
https://www.youtube.com/channel/UCDnYBh2TtUAfQ0Z-tl0jTyw
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした