Cron tasks with style: Whenever
Whenever is simple and very useful tool for defining cron jobs in ruby.
First things first, add whenever to your Gemfile (you use bundler, right?):
gem 'whenever', :require => false
Configuration is kept in config/schedule.rb. It uses plain ruby DSL. Periodically executed code is wrapper in every blocks, in which you specify your command or rake task to be run.
It is good idea to set output redirection and disable default cron behaviour of emailing standard output (otherwise you end up with thousands local emails).
set :output, '/home/web/fakturoid/shared/log/cron.log' env :MAILTO, "''"
Basic example can be running rake task for cleaning stale database sessions:
every 2.hours do rake "db:sessions:clean_nonactive" end
I prefer application related tasks to be grouped under app namespace:
every 1.day, :at => '0:30 am' do rake "app:mark_as_overdue" rake "app:invoices_from_generators" end
Backups should be also scheduled to run nightly:
every 1.day, :at => '2:30 am' do REMOTE = "someaccount@someserver.com:backups" rake "backup BACKUP_REMOTE=#{REMOTE}" end
As you can see, I use rake tasks to perform scheduled jobs. But if you have background job queue system in place, it would be wise to use cron only for placing task in queue.
To generate cron configuration from ruby DSL run whenever command (via bundle exec whenever). But real fun starts with capistrano integration to regenerate cron settings after deploy. All your cron tasks will run under user specified in capistrano application variable.
# whenever.rb capistrano task namespace :deploy do desc "Update the crontab file" task :update_crontab, :roles => :db do run "cd #{current_path} && /opt/ruby-enterprise/bin/bundle exec whenever --update-crontab #{application}" end end after "deploy:restart", "deploy:update_crontab"
Comments [0]

