ruby-on-rails - mac - whenever rails heroku
Rails cron when, bundle: comando no encontrado (12)
Intento usar cada vez que ejecuto una tarea de rake por día. Estoy obteniendo este error
/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>''
Aquí está mi 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
No entiendo por qué no funciona. Si ejecuto el comando:
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
Funciona bien, no estoy seguro de lo que está pasando aquí.
Creo que debería intentar establecer explícitamente las variables de entorno GEM_HOME y GEM_PATH en su crontab. También podría intentar ejecutar algo así como la gem list --local
gem environment
gem list --local
o gem environment
través de cron y verificar el resultado.
Después de tantas pruebas, parece que funciona lo siguiente
Escriba lo siguiente desde la terminal
Escriba crontab -e Esto abre el crontab para editar. Verá dos líneas de la siguiente manera:
# 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
Y
# 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
Comenta ambas líneas comenzando con PATH.
Realice el paso anterior siempre que ejecute el comando "bundle exec whenever". Y funciona.
No tengo idea de por qué PATH está engañando al medio ambiente.
Ejecutando un comando de esa manera: /bin/bash -l -c
Está lanzando un comando bash como un shell de inicio de sesión que va a generar (ejecutar) /etc/profile
bash file como un archivo de instalación. De este modo, si comprueba este archivo, podría tener líneas de comando bash que borren su $PATH
anterior que no desea, ya que contiene su ruta a su paquete y todos sus otros comandos en primer lugar.
Para solucionar este problema, solo tiene que eliminar las líneas relacionadas con la configuración de la variable $PATH
en su /etc/profile
.
En mi caso, acabo de correr:
rvm env --path -- ruby-version[@gemset-name]
En referencia a cron setup setup doc
Se agregó una nueva línea de origen al comando para la ruta de Ruby antes del comando de paquete en el crontab -e
source /usr/local/rvm/environments/ruby-1.9.3-p392;
Ahora los comandos son como los siguientes:
Antes de:
0 4 * * * cd /home/current && bundle exec rake my_rake RAILS_ENV=production
Después:
0 4 * * * cd /home/current && source /usr/local/rvm/environments/ruby-1.9.3-p392; bundle exec rake my_rake RAILS_ENV=production
¡¡¡Aclamaciones!!!
Este es un problema ENV [''PATH''] no establecido. La forma más elegante de solucionar esto es adjuntar las secuencias de comandos relacionadas con rvm a la ruta inmediatamente después de la instalación. Agregue las siguientes líneas al comienzo de .bashrc (principio y no fin). Cuando se accede a .bashrc mediante un shell no interactivo, la línea [ -z "$PS1" ] && return
arroja un error y las líneas siguientes no se ejecutan.
PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
y no intentar establecer explícitamente las variables de entorno PATH y sully.
Jugué con esto toda la tarde y no pude encontrar una mejor solución. Esto es lo que se me ocurrió
bundle install --binstubs
y luego corre
bin/rake daily:stats
Odio este problema. He pasado horas intentando resolverlo también.
Lo que funciona para mí es agregar
RAILS_ENV=production; source /usr/local/rvm/scripts/rvm;
antes del comando paquete.
Olvídese de la configuración de PATH en los archivos cron. Establecer la RUTA no funciona.
Establezca la ruta para agrupar explícitamente en su config / schedule.rb
set: bundle_command, "/ usr / local / bin / bundle"
Para una solución moderna, agregue esta línea en capistrano deploy.rb,
set :whenever_command, "bundle exec whenever"
Puedes probar la siguiente solución que encontré mientras buscábamos en Google y eso me funciona finalmente ... espero que eso funcione contigo.
Implementé y probé lo mismo en la producción, asegúrate de cambiar el entorno en consecuencia.
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!
La mejor de las suertes, este problema ocurrió después de 3 años, ya que estaba usando antes simplemente lo que se da en la documentación de la gema en la producción.
Estoy usando Ruby 2.xy Rails 4.2 con la última versión 0.9.4. También debería funcionar con una versión anterior, si la naturaleza del problema es la misma.
gracias.
También puede asegurarse de que su RUTA termine en el crontab, colocando lo siguiente en la parte superior del archivo schedule.rb:
env :PATH, ENV[''PATH'']
https://groups.google.com/forum/#!msg/whenever-gem/yRLt3f2jrfU/Exu3xfCo8DAJ
Si la solución anterior no funciona para usted, intente:
env :GEM_PATH, ENV[''GEM_PATH'']
[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