Crontab dentro da sua aplicação rails com whenever

Æ!!

Hoje estou aqui para falar de uma coisa que quando vi pela primeira vez ignorei por parecer uma coisa boba, mas olhando melhor eu percebi que é uma idéia bem interessante. O que a gem whenever faz é manter o seu crontab de uma forma mais Ruby, e melhor, dentro da sua aplicação!

A principio parece estranho tentar manter o crontab dentro da sua aplicação, mas ganhamos muitas vantagens com isso:

  • versionamento
  • menos acesso ao servidor
  • rapida atualização do crontab do servidor via capistrano
  • forma mais legível de ver o crontab

E tudo isso não influi no crontab que você já possui ( e que muitas vezes tem muita coisa que não é relacionada com a aplicação ), pois o whenever cria uma seção que ele atualiza mantendo a seção antiga onde está.

Para instalar o whenever é a mesma facilidade de sempre:

   sudo gem sources -a "http://gemcutter.org"
   sudo gem install whenever

OBS: Lembrando que a primeira linha só é necessária uma vez, se você já tem o gemcutter no seu sources então ignore-a.

Depois disso execute:

   wheneverize .

O comando acima vai gerar os arquivos necessários para a utilização do whenever ( básicamente o config/schedule.rb ).

E a partir de agora você já pode atualizar o seu crontab com as suas configurações feitas no config/schedule.rb executando o comando:

   whenever --update-crontab suaaplicacao

Quando você passa como parametro a sua aplicação ele cria um bloco apenas para as configurações da sua aplicação no crontab.

Mas é claro que você não vai precisar acessar o servidor e executar esse comando toda vez que você alterar o arquivo de schedule, para isso você provavelmente deve estar usando o capistrano para ser mais DRY. Se estiver usando inclua algumas linhas no seu deploy.rb:

   after "deploy:symlink", "deploy:update_crontab"
 
   namespace :deploy do
      desc "Update the crontab file"
      task :update_crontab, :roles => :db do
         run "cd #{release_path} && whenever --update-crontab #{application}"
      end
   end

OBS: Se você tiver problemas no deploy com essa linha ( como se o comando whenever não existisse ), tente adicionar o path absoluto para o whenever.

E com isso a cada vez que você fizer um cap server deploy seu crontab será atualizado com as configurações contidas no config/schedule.rb.

Veja alguns exemplos do que pode ter no seu schedule.rb:

  every 4.minutes do
    rake "ts:in"
  end
 
  every 1.day, :at => '5:25 am' do
    rake "bla_bla"
  end
 
  every [:monday, :thursday], :at => '11:59 am' do
    command "sudo rm -rf /" # claro!
  end

Nada do que eu demonstrei aqui é uma grande novidade, você pode ver mais exemplos de como usar no Railscasts e na própria página do plugin.

Espero que seja útil para mais alguem como está sendo para mim.

Há braços

Tags: , ,

Wednesday, December 2nd, 2009 Development

5 Comments to Crontab dentro da sua aplicação rails com whenever

  1. Não exatamente relacionado com o assunto do tópico, mas não seria o ideal usar o gem install gemcutter && gem tumble? Acho q o gemcutter tem mais features….

    Quanto ao whenever, só tenho uma coisa a dizer: coisa linda. Mas quando vc gera o crontab, qual crontab q ele escreve?

  2. Vini] on December 3rd, 2009
  3. Show!!

    Acho que das vantagens, a que mais me motivou a usar foi a legibilidade de ver ‘every :monday, :at => “10:00 am” ..’ ao inves de ’0 10 * * 1′ =D

    Manter o crontab versionado é coisa linda!

    Abraço!

  4. Mateus on December 3rd, 2009
  5. Æ!!

    @vini] ( Vini fecha colchetes ) Ele escreve um bloco ( marca um inicio e fim para ele sempre sobrescrever aquilo ) no crontab do user atual. :)

    @Mateus Realmente! E deixar versionado tambem é ótimo!

    Há braços

  6. PotHix on December 3rd, 2009
  7. Desculpa a ignorancia, se for o caso, mas isso funciona na Dreamhost (basic) ?

    []s

  8. Fabiano P S on January 10th, 2010
  9. Æ!!

    @FabianoPS Eu acho que sim cara, se você conseguir instalar gems e editar o crontab na mão a gem provavelmente conseguirá. :)

    Há braços

  10. PotHix on January 10th, 2010

Leave a comment

My last Tweet

Search