Reputation: 4144
I have a Rails runner task that I want to run from cron
, but of course cron
runs as root
and so the environment is set up improperly to get RVM to work properly. I've tried a number of things and none have worked thus far. The crontab
entry is:
* 0 * * * root cd /home/deploy/rails_apps/supercharger/current/ && /usr/local/rvm/wrappers/ruby-1.9.3-p484/ruby bundle exec rails runner -e production "Charger.start"
Apologies for the super long command line. Anyhow, the error I'm getting from this is:
ruby: No such file or directory -- bundle (LoadError)
So ruby is being found in the RVM directory, but again, the environment is wrong.
I tried rvm alias delete [alias_name]
and it seemed to do something, but darn if I know where the wrapper it generated went. I looked in /usr/local/rvm/wrappers
and didn't see one with the name I had specified.
This seems like a common problem -- common enough that the whenever
gem exists. The runner command I'm using is so simple, it seemed like a slam dunk to just put this entry in the crontab
and go, but not so much...
Any help with this is appreciated.
Upvotes: 1
Views: 688
Reputation: 9495
It sounds like you could use a third-party tool to tether your Rails app to cron: Whenever. You already know about it, but it seems you never tried it. This gem includes a simple DSL that could be applied in your case like:
every :day # Or specify another period, or something else, see README
runner "Charger.start"
end
Once you've defined your schedule, you'll need to write it into crontab with whenever
command line utility. See README
file and whenever --help
for details.
It should not cause any performance impact at runtime since all it does is conversion into crontab format upon deployment or explicit command. It's not needed, once the server is running, everything is done by cron
after that.
If you don't want an extra gem anyway, you might as well check what command does it issue for executing your task. Still, an automated way of adding a cron
task is easier to maintain and to deploy. Sure, just tossing a line into the crontab is easier — just for you and just this once. Then it starts to get repetitive and tiring, not to mention confusion for other potential developers who will have to set up something similar on their own machines.
Upvotes: 1
Reputation: 2488
You can run cron as different user than root. Even in your example the task begins with
* 0 * * * root cd
root
is the user that runs the command. You can edit it with crontab -e -u username
.
If you insist on running cron task as root or running as other user does not work for some reason, you can switch user with su
. For example:
su - username -c "bundle exec rails runner -e production "Charger.start"
Upvotes: 1