54 votes

Rails cron à chaque fois, bundle: commande introuvable

J'essaie d'utiliser chaque fois pour exécuter une tâche de râteau une fois par jour. J'obtiens cette erreur

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

voici mon 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

Je ne comprends pas pourquoi cela ne fonctionne pas. Si je lance la commande :

 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

Cela fonctionne bien, je ne sais pas ce qui se passe ici.

71voto

Dennis Kuczynski Points 356

Vous pouvez également vous assurer que votre PATH se retrouve dans la crontab, en plaçant ce qui suit en haut du fichier schedule.rb :

 env :PATH, ENV['PATH']

https://groups.google.com/forum/#!msg/whenever-gem/yRLt3f2jrfU/Exu3xfCo8DAJ

Si la solution ci-dessus ne fonctionne pas pour vous, essayez :

 env :GEM_PATH, ENV['GEM_PATH']

6voto

Sumit Munot Points 1253

Dans mon cas, je viens de lancer :

 rvm env --path -- ruby-version[@gemset-name]

Se référer à la doc de configuration des tâches cron

Ajout d'une nouvelle ligne source à la commande pour le chemin ruby avant la commande bundle dans le crontab -e

 source /usr/local/rvm/environments/ruby-1.9.3-p392;

Maintenant, les commandes comme ci-dessous :

Avant:

 0 4 * * * cd /home/current && bundle exec rake my_rake RAILS_ENV=production

Après:

 0 4 * * * cd /home/current && source /usr/local/rvm/environments/ruby-1.9.3-p392; bundle exec rake my_rake RAILS_ENV=production

À votre santé!!!

4voto

buddy Points 59

Après tant d'essais, ce qui suit semble fonctionner

Tapez ce qui suit à partir du terminal

  1. Tapez crontab -e Cela ouvre la crontab pour l'édition. Vous verrez deux lignes comme ci-dessous :

     # 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
    

    ET

     # 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. Commentez les deux lignes commençant par PATH.

Effectuez l'étape ci-dessus chaque fois que vous exécutez la commande "bundle exec when". Et il fonctionne.

Aucune idée de pourquoi PATH trompe l'environnement.

3voto

cailinanne Points 4737

Je déteste ce problème - j'ai passé des heures à essayer de le résoudre aussi.

Ce qui fonctionne pour moi, c'est d'ajouter

 RAILS_ENV=production; source /usr/local/rvm/scripts/rvm;

avant la commande bundle.

2voto

vanboom Points 164

Oubliez les paramètres PATH dans les fichiers cron. La définition du PATH ne fonctionne pas.

Définissez le chemin d'accès au bundle explicitement dans votre config/schedule.rb

set :bundle_command, "/usr/local/bin/bundle"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X