Почему грабли не запускаются через cron? - PullRequest
1 голос
/ 27 марта 2019

Я определил задачу таким образом, чтобы при запуске rake background:fetch_image мой пользователь работал как положено. Это также работает, как и ожидалось, если я запускаю sudo -u www-data rake background:fetch_image. Я не верю, что ошибка, которую я опишу, вызвана кодом, который я написал в самой задаче.

Я использую всякий раз, когда драгоценный камень, чтобы обработать планирование. После установки некоторых переменных для исправления предыдущих ошибок всякий раз, когда создает строку в crontab, например:

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'

Когда cron выполняет это, я получаю эту ошибку:

/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'

Эта ошибка возникает только тогда, когда задача запускается через cron таким способом. Я попытался включить решения, которые расширяют переменную PATH и выполняют rbenv init, но ни одна из них не исправила эту проблему.

Почему cron ведет себя так по-разному, что вызывает эту ошибку, и как ее можно исправить?

1 Ответ

1 голос
/ 27 марта 2019

Я закончил тем, что изменил используемую переменную PATH так, чтобы вместо / usr / bin / ruby ​​использовалась / usr / local / bin / ruby. Я сделал это, изменив код, найденный здесь до такого результата в 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}

Это привело к тому, что версии, используемые cron и моими пользователями, оказались в одной строке.

...