Rails cron whenever, bundle: команда не найдена
Я пытаюсь использовать, когда для выполнения задачи грабли onces в день. Я получаю эту ошибку
/bin/bash: bundle: command not found
/home/app/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:247:in `to_specs': Could not find bundler (>= 0) amongst [minitest-1.6.0, rake-0.8.7, rdoc-2.5.8] (Gem::LoadError)
from /home/app/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:256:in `to_spec'
from /home/app/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1/rubygems.rb:1210:in `gem'
from /home/app/.rvm/gems/ruby-1.9.2-p180/bin/bundle:18:in `<main>'
вот мой crontab
# Begin Whenever generated tasks for: /home/af/www/app/releases/20120216172204/config/schedule.rb
PATH=/home/af/.rvm/gems/ruby-1.9.2-p180@global/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
0 0 * * * /bin/bash -l -c 'cd /home/af/www/app/releases/20120216172204 && rvm 1.9.1-p180; RAILS_ENV=production /home/af/.rvm/gems/ruby-1.9.2-p180/bin/bundle exec rake daily:stats --silent >> /home/af/www/app/releases/20120216172204/log/cron.log 2>&1'
# End Whenever generated tasks for: /home/af/www/app/releases/20120216172204/config/schedule.rb
Я не понимаю, почему это не работает. Если я выполню команду:
cd /home/af/www/app/releases/20120216172204 && rvm 1.9.1-p180; RAILS_ENV=production /home/af/.rvm/gems/ruby-1.9.2-p180/bin/bundle exec rake daily:stats --silent >> /home/af/www/app/releases/20120216172204/log/cron.log 2>&1
он работает нормально, не уверен, что здесь происходит.
12 ответов
вы также можете убедиться, что ваш путь заканчивается на crontab, поместив следующее в верхней части расписания.файл rb:
env :PATH, ENV['PATH']
https://groups.google.com/forum/#!msg/whenever-gem/yRLt3f2jrfU/Exu3xfCo8DAJ
Если приведенное выше решение не работает для вас, попробуйте:
env :GEM_PATH, ENV['GEM_PATH']
после стольких попыток следующее, кажется, работает
введите следующее в терминале
-
введите crontab-e Откроется вкладка crontab для редактирования. Вы увидите две строки, как показано ниже:
# cron clears out environment variables, but Rubber.root/script/rubber uses # "rvm do default" to run, so no longer any need to setup ruby env vars here, # all we need is PATH PATH=/<path to bundle>/bundle/ruby/1.9.1/bin:/usr/local/rvm/gems
и
# Begin Whenever generated tasks for: /mnt/wamjoke-production/releases/20120912$ PATH=/<path to bundle>/shared/bundle/ruby/1.9.1/bin:/usr/local/rvm/gems
закомментируйте обе строки, начинающиеся с PATH.
выполните вышеуказанный шаг всякий раз, когда вы запускаете команду" bundle exec whenever". И это работает.
Не знаю, почему Путь вводит в заблуждение окружающую среду.
в моем случае я просто убежала :
rvm env --path -- ruby-version[@gemset-name]
со ссылкой на cron настройка задания doc
добавлена новая исходная строка в команду для ruby path
перед командой bundle в crontab -e
source /usr/local/rvm/environments/ruby-1.9.3-p392;
теперь команды, как показано ниже:
перед:
0 4 * * * cd /home/current && bundle exec rake my_rake RAILS_ENV=production
после:
0 4 * * * cd /home/current && source /usr/local/rvm/environments/ruby-1.9.3-p392; bundle exec rake my_rake RAILS_ENV=production
Ура!!!
Я ненавижу эту проблему - я потратил часы, пытаясь ее решить.
то, что работает для меня, это добавить
RAILS_ENV=production; source /usr/local/rvm/scripts/rvm;
перед командой bundle.
Я думаю, вы должны попробовать явно установить переменные среды GEM_HOME и GEM_PATH в вашем crontab. Вы также можете попробовать что-то вроде gem list --local
или gem environment
через cron и проверку вывода.
выполнив команду таким образом:/bin/bash -l -c
вы запускаете команду bash в качестве оболочки входа в систему, которая собирается source (execute) /etc/profile
bash файл в качестве файла установки. При этом, если вы проверите этот файл, у него могут быть командные строки bash, которые удаляют ваш предыдущий $PATH
который вы не хотите, так как он содержит ваш путь к вашему пакету и все ваши другие команды в первую очередь.
чтобы устранить эту проблему, вам просто нужно удалить строки, связанные с настройкой the $PATH
переменной в .
Я играл с этим весь день и не мог найти лучшего решения. Вот что я придумал
bundle install --binstubs
а затем запустите
bin/rake daily:stats
это проблема ENV ['PATH'] не установлена. Самый элегантный способ исправить это-добавить скрипты, связанные с rvm, в путь сразу после установки. Добавьте следующие строки в начало .bashrc (начало, а не конец, как когда .доступ к bashrc осуществляется неинтерактивной оболочкой, строка [ -z "$PS1" ] && return
выдает ошибку и последующие строки не выполняются.
PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
и не пытайтесь явно установить PATH и sully переменные среды.
забудьте о настройках пути в файлах cron. Установка пути не работает.
задайте путь к bundle явно в вашей конфигурации / расписании.rb
set :bundle_command,"/usr/local/bin / bundle"
вы можете попробовать ниже решение, которое я нашел во время googling, и это работает для меня, наконец....надеюсь, это сработает.
я реализовал и протестировал то же самое на производстве убедитесь, что изменить среду соответственно -
set :output, "{your path on the server}/log/cron_log.log"
set :environment, :production
env :PATH, ENV['PATH']
job_type :rbenv_rake, %q!eval "$(rbenv init -)"; cd :path && :environment_variable=:environment bundle exec rake :task --silent :output!
удачи, эта проблема возникла после 3 лет, как я использовал до того, как просто то, что дано в документации gem по производству.
Я использую Ruby 2.x и Rails 4.2 с последней версией 0.9.4. Он следует работать и с более ранней версией, если характер проблемы такой же.
спасибо.
для современного исправления добавьте эту строку в Capistrano deploy.rb,
set :whenever_command, "bundle exec whenever"
[root@smbserver current]# crontab-e
02 22 * * 1-5 /bin/bash -l -c /shell/day.sh
30 14 * * 0 /bin/bash -l -c /shell/week.sh