Gemの'whenever'を使ってcronをセットする方法【rails】

はじめに

wheneverというGemを使ってcronをセットする方法について

設定方法

まずwheneverというGemをインストールします。

gem 'whenever', require: false
$ bundle install

続いて、下記コマンドで設定ファイルを作成します。

$ wheneverize .

するとconfig配下にschedule.rbというファイルが作成されるので、ここに設定を記述していきます。

今回は、update_article:change_statusというrakeタスクを1時間ごとに実行するための設定をします。

require File.expand_path(File.dirname(__FILE__) + "/environment")  #Rails.rootを使用するため

rails_env = ENV['RAILS_ENV'] || :development  # 環境変数を定義

set :environment, rails_env  # 環境を設定

env :PATH, ENV['PATH']

set :output, "#{Rails.root}/log/cron.log"  # cronのログの吐き出し場所を設定

every :hour do  # every 1.hour doでもOK
  rake 'update_article:change_status'
end

上記の設定が完了したら、cronへ設定を反映させます。

設定ファイルの確認やcronへの反映などのコマンドは下記の通りです。

$ whenever  # 設定ファイルを確認

$ whenever --update-crontab # cronに設定を反映

$ whenever --clear-crontab # cronから設定を削除

$ crontab -l # 設定されているcronを確認

wheneverが実行されない場合

上記の設定をしても、wheneverが実行されないときがあります。

設定したcron.logに下記のような出力がされる。

/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems.rb:283:in `find_spec_for_exe': Could not find 'bundler' (2.2.6) required by your /Users/morikyohei/workspace/runteq/application_task/987_kikikiki2727_runteq_learning_advanced/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.
To install the missing version, run `gem install bundler:2.2.6`
    from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems.rb:302:in `activate_bin_path'
    from /usr/bin/bundle:23:in `<main>'

これはどうやらrbenvがうまく使えてないことが原因のようです。

解決方法は、wheneverにデフォルトで設定されているrakeのjob_typeを下記のように変更します。

set :job_template, "/bin/zsh -l -c ':job'"
job_type :rake, "export PATH=\"$HOME/.rbenv/bin:$PATH\"; eval \"$(rbenv init -)\"; cd :path && RAILS_ENV=:environment bundle exec rake :task :output"

job_templateに関しては、デフォルトではbashになっているのでzshに変更します。

これで上記のエラーが解決されます!