Getting Ruby scripts working with bundler, rvm and cron
If you want the run some Ruby code by cron, that is wrapped into a shell script and uses bundler you will maybe see something like this:
cannot load such file -- bundler/setup
This will never occur if it's running from the command line.
After struggling with it and dangerous superficial knowledge about cron I found a solution that works very well for me.
Update:
You should read anything after the Update section to know why the above mentioned problem occurs!
The lines below are working great if you haven't any specific gemsets to use. If you have, you have
to proceed with GEMHOME and GEMPATH environment variables the same way you will do it with PATH.
A more better solution that isn't mentioned at the RVM homepage in their cron section is the following:
rvm use .... # select the ruby you want to use
rvm cron setup # let RMV do your cron settings
crontab -e # add a new cronjob
-- end of the update section.
Cron passes very few informations about the environment to the scripts runned by itself. To see what is passed try it by adding a new job with crontab -e</code>.
* * * * * set > ~/tmp/setvals
Wait a while and then take a look at ~/tmp/setvals</code>
HOME='/home/brewster'
IFS=''
LANG='en_US.UTF-8'
LANGUAGE='en_US:en'
LC_ALL='en_US.UTF-8'
LOGNAME='brewster'
OPTIND='1'
PATH='/usr/bin:/bin'
PPID='23152'
PS1='$ '
PS2='> '
PS4='+ '
PWD='/home/brewster'
SHELL='/bin/sh'
With that informations it's very clear that the script will never have any access to the Ruby executable given by rvm.
The solution is to add a custom PATH environment configuration to the cronfile - if you want to have this behaviour globally working for all your scripts.
To get the used rvm Ruby, try
rvm env --path
in your console and then add to the top of your cronfile (crontab -e</code>):
PATH=/usr/local/rvm/gems/ruby-1.9.3-p392/bin:/usr/local/rvm/gems/ruby 1.9.3p392@global/bin:/usr/local/rvm/rubies/ruby-1.9.3p392/bin:/usr/local/rvm/bin:/home/brewster/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Or whatever you want to have in PATH</code>. (I installed bundler</code> in my global</code> gemset.)
Written by Daniel Schmidt
Related protips
6 Responses
Actually there are some recommendation for setting up cron in RVM docs: http://rvm.io/integration/cron
I know this recommendations, but they didn't work for me as I expected, so I have to use the workaround I described above.
To be hones, I really liked the content, but the title almost made me not read it... just FYI. Sounded like a rant ;)
@kjellski - Changed the title to something not-so-rant-like. ;-)
great! sounds more like the goodness it provides :)
Okay, I tried it the hard way by coding PATH myself. Then I got smart and decided to just let "rvm cron setup" do it for me. Worked like a charm. Thanks!