your updated not mac job converted above ruby bash cron sh whenever

updated - Estableciendo ruta para siempre en cron para que pueda encontrar ruby.



cron job on mac (3)

Mi rubí está en / usr / local / bin. whenever que no puedo encontrarlo, y configurar PATH en la parte superior de mi archivo cron tampoco funciona, creo que porque siempre se ejecuta el comando dentro de una nueva instancia de bash.

# this does not work PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin # Begin Whenever generated tasks for: foo 0 * * * * /bin/bash -l -c ''cd /srv/foo/releases/20110429110637 && script/rails runner -e production ''/'''ActiveRecord::SessionStore::Session.destroy_recent(15)''/''''' # End Whenever generated tasks for: foo

¿Cómo puedo saber cuándo está mi binario rubí? Hacer un enlace simbólico desde / usr / bin me parece desordenado, pero creo que esa podría ser la única opción.

Esta pregunta ofrece env :PATH, "..." en schedule.rb como solución, pero (a) no puedo encontrar ninguna documentación de esa característica en ningún lugar de la documentación (b) que no parece haber resuelto el problema. problema de la persona que pregunta (desafortunadamente, me lleva un tiempo de respuesta no trivial solo para probarlo). En realidad, la actualización está en la parte inferior de esta página , lo intentaré ahora.

más información

  1. No puedo modificar el comando cron porque es generado por cuando
  2. Verifiqué que si hago una nueva shell bash con bash -l , / usr / bin / env encuentra a Ruby muy bien
  3. Acabo de probar el comando exacto en cron, comenzando con / bin / bash, desde la línea de comandos de ese usuario, y funcionó.

Entonces, esto es muy misterioso ...


Como señaló John Bachir, puedes hacerlo a través de env . Pero déjame añadir más entrada. Estoy desplegando en AWS Opsworks. Desafortunadamente, no tienen un administrador de ruby ​​(RVM, Rbenv, etc.) instalado de forma predeterminada.

Lo primero que tenía que hacer era SSH en la instancia y averiguar qué ruby ​​estaba usando. Esto fue bastante fácil ejecutando el comando which ruby en un terminal.

$ which ruby /usr/local/bin/ruby

Cron estaba usando ruby ​​ubicado en /usr/bin/ruby . Esto necesitaba ser cambiado.

En schedule.rb, tengo:

set :env_path, '''' env :PATH, @env_path if @env_path.present?

En local, env_path no necesita configurarse. Para la mayoría de los usuarios, lo único que se debe hacer es ejecutar siempre que:

bundle exec whenever --set ''environment=development'' --update-crontab

En un entorno de ensayo / producción, ruby ​​puede instalarse en otro lugar. Así que ejecutar esto puede ser más apropiado:

bundle exec whenever --set ''environment=staging&env_path=/usr/bin/local'' --update-crontab

Deberá reemplazar /usr/bin/local con la salida de echo $PATH .

En Opsworks, sin embargo, necesitaba crear una receta personalizada de Chef que se pareciera a:

node[:deploy].each do |application, deploy| execute ''whenever'' do user ''deploy'' group ''nginx'' cwd "#{deploy[:deploy_to]}/current" command "bundle exec whenever --set ''environment=#{deploy[:environment_variables][:RAILS_ENV]}&env_path=#{ENV[''PATH'']}'' --update-crontab" end end

Espero que la información aquí sea suficientemente clara.



reescribe tu crontab como

0 * * * * { PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin ; export PATH ;/bin/bash -l -c ''cd /srv/foo/releases/20110429110637 && script/rails runner -e production ''/'''ActiveRecord::SessionStore::Session.destroy_recent(15)''/''''' ; }

O deberías intentar averiguar por qué tu shell BASH no está seleccionando el PATH = ... que es casi seguro en tu .profile o .bash_profile.

Espero que esto ayude.