I always dislike setting up cron jobs for web applications. The whole application lives in /var/www but I manually create this single line somewhere else that I have to remember to setup if I switch servers, and turn off if needed, and maintain accordingly. Well, it so happens that it can be done much better with the tools we already have: the usual cron and capistrano (or any other similar release tool).

In Restraq, a project I’m working on, I created a file named crontab in the config directory with these contents:

*/5 * * * * www-data cd /var/www/restraq/current && RAILS_ENV=production rake mail:get

Cron can read from some predefine files but it also reads every file in /etc/cron.d/. That’s a very common Linux pattern, the files in the directory with the .d extension are read as if they were one big configuration file. Other programs do it too.

Then it’s only a matter of installing it there on deployment. At first I’ve tried with a symlink but it seems cron ignores symlinks so I decided to copy it with this line on my deploy.rb file:

run "#{try_sudo} cp #{current_path}/config/crontab /etc/cron.d/restraq"

and that’s it. No more fragmentation. Whenever, wherever I install my web app, there goes the cron jobs.