Utilizando o cartucho cron

Rotinas periódicas usando cron

Muitas aplicações precisam executar rotinas em segundo plano, efetuar backups ou relatórios. Para isso você pode utilizar o cartridge de cron, que funciona da mesma forma que sistemas baseados em Linux e Unix.

Com sua aplicação já criada, adicione o cartucho de cron. 

$ rhc cartridge add cron-1.4 -a meuapp
$ cd meuapp

Ou se preferir, inclua o cartucho na criação da aplicação:

$ cd meuapp
$ rhc app create php-5.3 cron-1.4

Você receberá uma mensagem como essa:

cron-1.4 added to application meuapp
 
To schedule your scripts to run on a periodic basis, add the scripts to 
your application's .openshift/cron/{minutely,hourly,daily,weekly,monthly}/
directories (and commit and redeploy your application).
 
Example: A script .openshift/cron/hourly/crony added to your application
         will be executed once every hour.
         Similarly, a script .openshift/cron/weekly/chronograph added
         to your application will be executed once every week.

 

Você pode criar scripts que executam a cada minuto, hora, dia, semana e mes.

Para criar um script que rode a cada minuto:

$ mkdir -p .openshift/cron/minutely
$ cd .openshift/cron/minutely/
$ cat >>meucron <<EOF
#!/bin/bash
date >> \${OPENSHIFT_PHP_LOG_DIR}/meucron.log
EOF
$ chmod +x meucron

O script chamado "meucron" executará a cada minuto e o resultado será gravado no arquivo "meucron.log".  Note o uso da variável ${OPENSHIFT_PHP_LOG_DIR}. Específico para aplicações php-5.3, você deve utilizar variáveis de ambiente ao invés de caminhos hardcoded. 

Agora basta adicionar o script ao repositório git e executar o push:

$ git add meucron
$ git commit -a -m "meu primeiro cron"
$ git push

 

Pegue um café e aguarde alguns minutos....

 

Para conferir o log do script utilize o comando:

rhc tail -a meuapp -f php-5.3/logs/meucron.log

 

A saída será algo como:

Fri May 24 16:12:05 UTC 2013
Fri May 24 16:13:06 UTC 2013
Fri May 24 16:14:05 UTC 2013
Fri May 24 16:15:05 UTC 2013
Fri May 24 16:16:05 UTC 2013  

 

O horário do servidor está errado!

Se você prestar atenção no horário do servidor vai notar que ele está sempre adiantado 3 horas (2 no horário de verão). Isso se deve ao fato dos servidores da Getup rodarem apenas no horário UTC - Tempo Universal Coordenado.

Este é o horário base para os horários locais, ou seja, o horário 0 (zero). No Brasil, por exemplo, nosso horário é -03:00, então estamos sempre 3 horas atrás do horário universal.

Quando UTC for 22:30, então no Brasil será 22:30 - 03:00 = 19:30h. Da mesma forma, quando no Brasil for 14:15, então em UTC será 14:15 + 03:00 = 17:15h.

 Para mais informações sobre horários, consulte nosso artigo em https://getup.zendesk.com/entries/66427405.

Cron em aplicações escaláveis

Uma aplicação escalável é aquela que pode rodar com um ou mais gears web (código). Nesse caso, o cartucho de cron será instalado em cada gear web existente.

Isso significa que seu script será executado em paralelo ao longo de todos os gears.

Nem sempre este é o comportamento desejado. Por exemplo, se você envia emails através do cron, cada gear da aplicação pode acabar enviando emails duplicados para os destinatários.

Para resolver isso basta verificar se o script está rodando dentro do gear inicial da aplicação, e executar condicionalmente o envio:

if [ ${OPENSHIFT_GEAR_UUID} == ${OPENSHIFT_APP_UUID} ]; then
    echo "Estou no gear principal, posso enviar os emails agora..."
fi

 

Executando em um momento específico

Para executar o cron uma vez por dia, sempre à meia noite (UTC):

$ mkdir -p .openshift/cron/minutely
$ cd .openshift/cron/minutely/
$ cat >>meucron <<EOF
#!/bin/bash

# TIME=`date +%H:%M` # retorna apenas a hora atual
# Outros formatos de data:
# %H: hora (0..23)
# %I: hour (01..12)
#  %M: minuto (00..59)
#  %S: segundo
# %d: dia do mês
# %w: dia da semana (dom=0, seg=1, ter=2...)
# %m: mes (01-12)
# %Y: ano (2015)
# %y: ano (15)
if [ $TIME == "00:15" ]; then echo "Agora é meia noite e 15, UTC"
fi EOF

chmod +x meucron

 Executando a uma frequência específica

Para executar a uma frequência específico, tanto em minutos como em horas, podemos fazer um teste simples:

HOUR=`date +%H`
if [ $(( $HOUR % 3 )) == 0 ]; then
    echo 'Executando a cada 3 horas...'
fi

 

Tem mais dúvidas? Envie uma solicitação

0 Comentários

Por favor, entre para comentar.
Powered by Zendesk