tutorial rails mac create ruby-on-rails cron whenever

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

  1. 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

  2. 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.



[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