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
に変更します。
これで上記のエラーが解決されます!