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

после стольких попыток следующее, кажется, работает

введите следующее в терминале

  1. введите 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
    
  2. закомментируйте обе строки, начинающиеся с 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