Estoy intentando ejecutar una tarea de rake mediante un cronjob programado. Mi crontab se parece a esto:
0 1 * * 1-7 /bin/bash -l -c "cd ~/jobs/rake && rake reports:create >> ~/jobs/logs/cron.log"
Ruby en mi cuenta lo proporciona RVM, que se carga mediante ~/.bashrc
(antes de la verificación de no interacción):
# load RVM env
[[ -s $HOME/.rvm/scripts/rvm ]] && source $HOME/.rvm/scripts/rvm
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
# ... rest of logic
Una y otra vez, esta tarea no se ejecuta porque RVM no se carga cuando se llama a la tarea ( /usr/bin/ruby
en su lugar usa el sistema) y faltan dependencias de gemas.
¿Cómo puedo hacer que crontab cargue mi entorno de shell antes de ejecutar mis trabajos programados? gracias.
Respuesta1
¿No funcionaría simplemente obtener su ~/.bashrc en el cronjob?
0 1 * * 1-7 /bin/bash -l -c "source ~/.bashrc; cd ~/jobs/rake && rake reports:create >> ~/jobs/logs/cron.log"
Respuesta2
No se recomienda el uso del shell de inicio de sesión en procesos en segundo plano.
puedes usar este método:
0 1 * * 1-7 ~/.rvm/bin/rvm in ~/jobs/rake do rake reports:create >> ~/jobs/logs/cron.log"
también hay rvm cron
comando:
rvm help cron
Respuesta3
Después de investigar un poco tras la respuesta de @mpapis, parece que hay una página en el sitio de RVM queexplica cómo utilizar una instalación RVM específica en un script ejecutado por cron.
Básicamente, descubres qué RVM te gustaría usar ejecutando esto (usando Ruby 1.9.3 aquí):
$ rvm env --path -- 1.9.3-p125
Sustituya su versión Ruby específica. Esto apuntará al archivo que necesita editarse source
para que se cargue el entorno Ruby deseado.
Escriba el script que ejecutará su trabajo cron:
mitrabajo.sh
#!/bin/bash
# the full path to the RVM env you got from running `rvm env ...`
source ~/.rvm/environments/ruby-1.9.3-p125
# do stuff ...
cd ~/jobs/rake
rake reports:create
Asegúrate de hacer el archivo ejecutable:
chmod u+x myjob.sh
crontab
0 1 * * 1-7 bash -c "cd ~/jobs && ./myjob.sh"