Cron jobs in Ruby
Providencia uma forma fácil de criar e agendar jobs no cron
Através do arquivo (`config/schedule.rb`) são descritas tasks, que serão agendadas no cron
As tarefas são executadas através do Rails runner command (`rails runner`)
- Adicione ao gemfile (
gem 'whenever'
) - Inicialize o whenver (
$ wheneverize ./
), que irá criar o arquivoconfig/schedule.rb
A gem converte uma sintaxe simples para o formato do cron
every 3.hours do
runner ""UserMailer.coffe_for_code.deliver""
end
every 5.minutes do
runner "UserMailer.coffe_for_code.deliver"
end
every 1.day, :at => '8:00 am' do
runner ""UserMailer.coffe_for_code.deliver""
end
every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot
runner ""UserMailer.coffe_for_code.deliver""
end
every :sunday, :at => '12pm' do # Use any day of the week or :weekend, :weekday
runner "Task.do_something_great"
end
every '0 0 27-31 * *' do
command "echo 'you can use raw cron syntax too'"
end
O rails runner permite invocar qualquer método, muito utilizado geralmente para Mailers É possível invocar a action de um model, que irá realizar toda a mágica, como por exemplo do vaicafé
# On scheduler
every 5.minutes do
# Can be any Model, Mailer or script
runner "Scheduler.hourly_update"
end
# The class
class Scheduler < ActiveRecord::Base
# something class methods and all things
def self.hourly_update
# do your rules
# Call the mailer
UserMailer.coffe_reminder.deliver
end
end
Para executar o whenever à cada deploy automaticamente, é preciso criar uma task que execute os comandos do whenever no servidor
- Criar a task manualmente via
queue![bundle exec whenever -w]
não irá funcionar - mina tem suporte default para o whenver, basta invokar no
config/deploy.rb
desc "Deploys the current version to the server."
task :deploy => :environment do
deploy do
# ...
invoke :'whenever:clear'
invoke :'whenever:update'
invoke :'whenever:write'
# ...
end
end
- Verifique o crontab se realmente efetivou as alterações
Por default, o whenever é executado na pasta da atual release, e ao executar o whenever -w
ele irá setar o path atual, ocasionando em erros por falta de arquivos, que estão linkados apenas na pasta current.
Para resolver é simples, porém manual
- Abra o crontab (
$ crontab -e
) - Verifique se o path esta setado para
\var\www\vaicafe\current
- Se não estiver, edite manualmente e salve
Mais detalhes em github/whenever
Crontab (english only) howto