September 07, 2010
UPDATED 6/7/2013 – We no longer recommend using bash -l -c to run Cron jobs with RVM. See our updated approach .
This info is for Scout users, but it’s also applicable to anyone who’s wondered how to use cron together with RVM. This assumes 1) you are using bash; 2) you running you cron tasks as a non-root user (say, “deploy”).
To use an RVM Ruby from cron, invoke your own bash session, like so:
* * * * * /bin/bash -l -c 'scout 8c6dc00d-af3a-4606-a384-...'
If you are editing root’s crontab, specify that the job is to be run by the deploy user:
* * * * * deploy /bin/bash -l -c 'scout 8c6dc00d-af3a-4606-a384-...'
We are wrapping our command (Scout in this case) in a bash session. The -c option tells bash a command follows. The -l option tells bash to load the entire environment. This option is crucial. Leave out the
-l and you’re in for some tedious debugging.
The wrapper is necessary because cron runs a very limited environment. RVM relies on environment variables to find Ruby, gems and gem executables (
env | grep rvm will show you RVM’s environmental additions).
bash -l brings all this into cron’s environment, so RVM just works. You don’t have to worry about PATH, gem executables, etc. They all work just like they do in your interactive bash sessions.
Important note: in most cases, you’ll want to use single quotes for the command you pass to bash.
Something not working? use this:
* * * * * /bin/bash -l -c 'scout 8c6dc00d-af3a-4606-a384-...' > /home/deploy/crondebug.log 2>&1
That last bit captures both normal and error output to a file. You can change the path it redirects to as needed.
The RVM documentation suggests two kinds of RVM installation in production. You can install RVM systemwide as root, or for a particular user. The cron technique outlined above works for both kinds of RVM installations.
Which kind of RVM installation is best for you? It depends on your needs.
System-wide installation may be better if:
A User-specific installation is probably better if:
See RVM’s instructions for system-wide install if you decide to go that route. Again, the format for cron outlined above works for either type of RVM install.