- wheneverでcronを正常作動させるまでの備忘録 -
執筆経緯
上記のgemを導入してmacbookローカル上で定期実行を試みたが、全くうまくいかず
・ログどこにあるの???
・何のエラー起きてるの???
となり、想定した動作をするまでにかなり時間を費やしたので
同じ症状の方が短時間で解決できるよう、解決方法と原因を周知するために執筆する。
私の環境
PC:MacBook Air (M1, 2020)
rails(アプリ側): 6.1.6.1
rails(ターミナル標準):5.2.8.1
テーマと扱わない事項
本記事のテーマは、macでwheneverを使用した際にcronを正常動作させるために
・”schedule.rb”にどのように記載すべきか
・記載内容の意味
をテーマに解説していきます。
wheneverの具体的な使い方については解説していません
結論
set :output, "#{Rails.root}/log/cron.log"
#railsアプリフォルダ内の./log/cron.logにログが出力されるようにする記述
require File.expand_path(File.dirname(__FILE__) + '/environment')
set :path_env, ENV['PATH']
rails_env = ENV['RAILS_ENV'] || :development
set :environment, rails_env
#railsアプリ内の実行環境を変数に代入している
job_type :runner, "cd :path && PATH=':path_env' bin/rails runner -e :environment ':task' :output"
#railsアプリ上の実行環境と同条件になるよう規定している
#:outputで事前にsetしたパスにログの出力先を設定
とりあえず、schedule.rb内に上記の記述を追記すればOK
補足
上記を追記してもうまくいかない方は
少なからず、ログは取れるようになったはずなのでログのエラー内容を見れば対処できるようになってます!
原因
macのcronログどこ?
最近のmac_bookのcronはログ出力先を指定しないとログを出力しない設定になっているようです。。。
そして、
every '*/1 * * * *' do
runner "Movie.publish_check"
end
のみしか記述せずにwhenever ==> cronに上げてしまうと
ログ出力先を指定してないことになり、どこにもログが吐き出されなくなります。。。
ターミナル(cron)とアプリ上で実行環境が違くなる
From: motoya@murakamimotoyas-MacBook-Air.local (Cron Daemon)
To: motoya@murakamimotoyas-MacBook-Air.local
Subject: Cron <motoya@murakamimotoyas-MacBook-Air> /bin/zsh -l -c 'cd /Users/motoya/study/whenevertest && bundle exec bin/rails runner -e development '\''Movie.publish_check'\'''
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=motoya>
X-Cron-Env: <USER=motoya>
Message-Id: <20220806024702.83064923436@murakamimotoyas-MacBook-Air.local>
Date: Sat, 6 Aug 2022 11:47:01 +0900 (JST)
/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.33) required by your /Users/motoya/study/whenevertest/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.33`
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>'
私の場合、上記のようなログがcron.logに残っていたのですが
先に提示した通り私の環境では
railsの標準バージョン:5.2.8.1
wheneverを実行するアプリのrailsバージョン:6.1.6.1
と差異が発生しており
cron側で特に何も設定しないと
ターミナル標準バージョンのrailsを使用して実行してしまうため
エラーが発生しておりました。。。
参考
https://qiita.com/uot/questions/a283becff015139ac760
上記の解答を参考に問題を解決させて頂きました!
最後に
これを機にcronのlog出力先は必ず指定することを忘れないようにしていきます!
間違ってる箇所等ありましたらお気軽に御指摘頂けますと幸いです!!!