views:

74

answers:

3

Is there anyway to setup simple task scheduling inside of a rails app? There are pieces of code that I want to run every hour, or every day or every week. I don't want to break them out into separate scripts that I then have to schedule via cron jobs. If I did that, then I'd have to remember to backup the scripts, and if I rebuild a server, I have to go and add back all the cron jobs, it just seems a little bit messy for what I need.

I wish I could just schedule a the jobs somewhere in my rails app and have them magically run when I want them to! Any ideas?

A: 

You can use something like Rails Cron (gem install rails_cron) to do this, which spins off another rails process dedicated to doing scheduled background tasks. I would recommend against doing it this way, as the extra rails instance will have to be monitored and stopped and started along with the rest of your app and, in my experience, is very prone to falling down.

A better solution is to just use Craken, http://github.com/latimes/craken, to manage crontabs through yaml files in your rails app. Each scheduled task gets defined in a yaml file and then on deployment Craken decides whether or not the System Level CronTab file needs to be updated or not. It plugs right into your capistrano deploy file and is reasonably turn-key. This gives the advantage of still managing your scheduled tasks in your rails app while actually executing them with the OS level cron.

Douglas Sellers
+3  A: 

There are gems/plugins for this, like rufus-scheduler or the more popular 'whenever' gem. I do like @douglassellers' solution though, I hadn't heard about it.

Trevoke
I'm a big fan of 'Whenever', just make sure that your hosting solution allows you enough access to edit the crontab. I recently launched on a shared hosting server where I had to use a web interface to install crontabs, and Whenever wasn't working for me.
Austin Fitzpatrick
The reason I like rufus-scheduler so much is that it works within your Rails app and can be configured like a crontab.
Trevoke
A: 

I use delayed job, a "database backed asynchronous priority queue" to accomplish something similar. Have a look at http://github.com/tobi/delayed_job

You will still need to have something that kicks off 'rake jobs:work' but it is better than having lots of different cron jobs. Notice in the documentation the :run_at attribute – that looks like it might solve the "schedule a the jobs somewhere in my rails app and have them magically run when I want them to" problem.

Jon M.