Tanto por razones de comodidad como de simplificar las puestas en producción de las aplicaciones que desarrollo con Ruby utilizo RVM.

La gran mayoría de aplicaciones suelen conllevar tareas periódicas añadidas, y una de las maneras más sencillas de realizarlas es añadiendo dichas tareas en cron. No obstante, si usas RVM te habrás encontrado con que si pones el comando tal cual en el crontab, por ejemplo:

*/15 * * * * cd /tu_app && RAILS_ENV=production bundle exec rake tu_tarea

No obtienes los resultados esperados.

La manera más sencilla de solucionar este problema es cambiando tu tarea en el crontab por algo parecido a lo siguiente:

*/15 * * * * /bin/bash -l -c 'cd /tu_app && RAILS_ENV=production bundle exec rake tu_tarea'

Ejecutando bash de esta manera estamos haciendo lo siguiente:

  • Con la opción -l indicamos que se cargue en modo login shell, es decir, como si hubiésemos iniciado sesión. Por tanto, cargará todo lo que esté definido en /etc/profile, ~/.bash_profile, ~/.bash_login y ~/.profile. En consecuencia cargaremos todo lo que necesitamos para que RVM se ejecute en ese usuario con normalidad.
  • La opción -c indica que ejecute el comando que se especifica en la cadena que hay a continuación. Una vez ejecutado, finaliza la ejecución de bash.