Skip to content

Instantly share code, notes, and snippets.

@gnomex
Last active August 29, 2015 13:56
Show Gist options
  • Save gnomex/9094058 to your computer and use it in GitHub Desktop.
Save gnomex/9094058 to your computer and use it in GitHub Desktop.
Whenever overview

Whenever

Cron jobs in Ruby

Como funciona

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`)

Configuração

  1. Adicione ao gemfile (gem 'whenever')
  2. Inicialize o whenver ($ wheneverize ./), que irá criar o arquivo config/schedule.rb

Sintaxe

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

Model integration

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

Mina integration

Para executar o whenever à cada deploy automaticamente, é preciso criar uma task que execute os comandos do whenever no servidor
  1. Criar a task manualmente via queue![bundle exec whenever -w] não irá funcionar
  2. 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
  1. Verifique o crontab se realmente efetivou as alterações

Troubleshooting

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

  1. Abra o crontab ($ crontab -e)
  2. Verifique se o path esta setado para \var\www\vaicafe\current
  3. Se não estiver, edite manualmente e salve

Recursos extras

Mais detalhes em github/whenever

Rails command line

Crontab (english only) howto

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment