Reputation: 3630
I have defined a task such that running rake background:fetch_image
as my user works as expected. It also works as expected if I run sudo -u www-data rake background:fetch_image
. I do not believe the error I shall describe is caused by code I wrote in the task itself.
I am using the whenever gem to handle scheduling. After setting some variables to correct previous errors whenever is producing a line in the crontab like:
0 2 * * * /bin/bash -l -c 'cd /var/www/site && RAILS_ENV=production /usr/local/bin/bundle exec rake background:fetch_image --silent >> /var/www/site/log/whenever.log 2>&1'
When cron executes this I get this error:
/usr/local/lib/ruby/2.6.0/pathname.rb:43:in `chop_basename': undefined method `match?' for /\A(?-mix:\/)?\z/:Regexp (NoMethodError)
Did you mean? match
from /usr/local/lib/ruby/2.6.0/pathname.rb:359:in `plus'
from /usr/local/lib/ruby/2.6.0/pathname.rb:351:in `+'
from /usr/local/lib/ruby/2.6.0/pathname.rb:188:in `parent'
from /usr/local/lib/ruby/2.6.0/bundler/shared_helpers.rb:29:in `root'
from /usr/local/lib/ruby/2.6.0/bundler.rb:234:in `root'
from /usr/local/lib/ruby/2.6.0/bundler.rb:246:in `app_config_path'
from /usr/local/lib/ruby/2.6.0/bundler.rb:273:in `settings'
from /usr/local/lib/ruby/2.6.0/bundler.rb:84:in `configured_bundle_path'
from /usr/local/lib/ruby/2.6.0/bundler.rb:351:in `use_system_gems?'
from /usr/local/lib/ruby/2.6.0/bundler.rb:541:in `configure_gem_path'
from /usr/local/lib/ruby/2.6.0/bundler.rb:534:in `configure_gem_home_and_path'
from /usr/local/lib/ruby/2.6.0/bundler.rb:66:in `configure'
from /usr/local/lib/ruby/2.6.0/bundler.rb:134:in `definition'
from /usr/local/lib/ruby/2.6.0/bundler.rb:101:in `setup'
from /usr/local/lib/ruby/2.6.0/bundler/setup.rb:20:in `<top (required)>'
from /usr/local/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /usr/local/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
This error only occurs when the task is run via cron in this manner.
I have tried including solutions that extend the PATH
variable and perform an rbenv init
but none corrected this issue.
Why is it that cron behaves so differently as to cause this error and how might it be fixed?
Upvotes: 1
Views: 209
Reputation: 3630
I ended up changing the PATH variable used so that /usr/local/bin/ruby was used rather than /usr/bin/ruby. I did it by modifying the code found here to this result in schedule.rb
:
job_type :rake, %Q{export PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin; cd :path && :environment_variable=:environment bundle exec rake :task --silent :output}
This brought the versions being used by cron and my users in line.
Upvotes: 1