Rails cron whenever, bundle: commande introuvable
j'essaie d'utiliser n'importe quand pour exécuter une tâche de râteau onces par jour. Im obtenir 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 ça 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
ça marche très bien, je ne sais pas ce qui se passe ici.
12 réponses
vous pouvez également vous assurer que votre chemin se termine dans le crontab, en mettant ce qui suit en haut de l'horaire.rb fichier:
env :PATH, ENV['PATH']
https://groups.google.com/forum/#!msg/whenever-gem/yRLt3f2jrfU/Exu3xfCo8DAJ
Si la solution ci-dessus ne fonctionnent pas pour vous, essayez de:
env :GEM_PATH, ENV['GEM_PATH']
Après de nombreux essais suivants semble fonctionner
tapez ce qui suit depuis le terminal
Tapez la commande " 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
commentez les deux lignes en commençant par le chemin.
faites l'étape ci-dessus chaque fois que vous lancez la commande "bundle exec whenever". Et il fonctionne.
aucune idée pourquoi le chemin est trompeuse de l'environnement.
Dans mon cas, j'ai juste couru :
rvm env --path -- ruby-version[@gemset-name]
faisant référence à cron job d'installation doc
ajout d'une nouvelle ligne source à la commande ruby path
avant de faisceau de commande 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
Cheers!!!
je déteste ce problème - j'ai passé des heures à essayer de le résoudre aussi.
Ce qui fonctionne pour moi est d'ajouter
RAILS_ENV=production; source /usr/local/rvm/scripts/rvm;
avant la commande bundle.
je pense que vous devriez essayer de définir explicitement les variables D'environnement GEM_HOME et GEM_PATH dans votre crontab. Vous pouvez aussi essayer de lancer quelque chose comme gem list --local
ou gem environment
par cron et vérification de la sortie.
en exécutant une commande de cette façon:/bin/bash -l -c
vous lancez une commande bash en tant qu'interpréteur de commandes de connexion qui va à source (execute) /etc/profile
bash fichier comme un fichier de configuration. En faisant cela, si vous vérifiez ce fichier, il pourrait avoir des lignes de commande bash qui effacent votre $PATH
ce que vous ne voulez pas car il contient votre chemin vers votre paquet et toutes vos autres commandes en premier lieu.
Pour résoudre ce problème il vous suffit de supprimer les lignes liées à configurer /etc/profile fichier.
j'ai joué avec ça tout l'après-midi et je n'ai pas pu trouver une meilleure solution. Voici ce que j'ai
bundle install --binstubs
et puis exécutez
bin/rake daily:stats
il s'agit d'un ENV['PATH'] pas de problème défini. La façon la plus élégante de corriger ceci est d'ajouter les scripts relatifs à la rvm au chemin juste après l'installation. Ajouter les lignes suivantes au début de .bashrc ( début et pas de fin que lorsque .bashrc est accessible par un shell non-interactif, la ligne [ -z "$PS1" ] && return
déclenche une erreur et les lignes suivantes ne sont pas exécutées.
PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
et ne pas essayer de définir explicitement les variables D'environnement PATH et sully.
Oubliez les paramètres de chemin dans les fichiers cron. Définir le CHEMIN d'accès ne fonctionne pas.
définissez explicitement le chemin vers le bundle dans votre config/schedule.rb
set: bundle_command, "/usr / local/bin / bundle"
Vous pouvez essayer la solution ci-dessous que j'ai trouvé en googlant et qui fonctionne pour moi finalement....espérons que devrait travailler avec vous.
j'ai mis en œuvre et testé la même chose sur la production assurez-vous que de changer l'environnement en conséquence -
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!
bonne chance, ce problème s'est produit après 3 ans car j'utilisais avant tout simple ce qui a donné sur la documentation de gem sur la production.
J'utilise Ruby 2.X et Rails 4.2 avec whenever 0.9.4 dernière version. Il devrait travailler avec une version antérieure ainsi, si la nature de la question est la même.
je vous remercie.
pour les correctifs modernes, ajouter cette ligne dans capistrano deploy.rb,
set :whenever_command, "bundle exec whenever"
[root@smbserver actuel]# crontab -e
02 22 * * 1-5 /bin/bash -l -c /shell/day.sh
30 14 * * 0 /bin/bash -l -c /shell/week.sh