Friday, January 29, 2010

Cron temporário utilizando bash

Se você tem um host onde a ativação de uma tarefa no cron pode levar alguns dias até o pessoal do suporte adicionar a entrada, mas você precisa desesperadamente testar um script ou um conjunto deles para verificar seu funcionamento no cron, crie o seu próprio cron. Crie um arquivo “run.sh” com o seguinte conteúdo:

#!/bin/sh

while [ 1 ];
do
    /usr/local/bin/php /caminho/ate/tarefa.php >> temp/log-exec.log
    sleep 1800
done

Depois, acesse via SSH seu servidor e execute:
$ chmod +x run.sh
$ ./run.sh > /dev/null &

Pronto, a cada 5 minutos o seu script será executado. Se quiser matar o processo:
$ ps x
$ kill -9 XXXXX

Onde XXXXX é o número do processo retornado pelo ps x.

Se quiser aumentar ou diminuir o tempo de execução, troque número 1800 do arquivo para o tempo desejado, em segundos.

Atenção: use com moderação e apenas para testes. Não utilize como uma forma definitiva de cron. Não tenho certeza sobre questões de desempenho ou segurança. Além do mais, qualquer restart no servidor irá fazer seu cron parar.

Thursday, October 22, 2009

Criando log das execuções de seu cron

Estou realizando um projeto onde a execução de alguns scripts a cada 5 minutos é fundamental. Caso alguma falha ocorra durante execução, conteúdos podem ser perdidos e, para achar o erro, sem um bom log, fica complicado.

A solução que usei para isso foi criar um arquivo shell — o servidor é linux — que executa o script php e armazena a saída em um arquivo de log.

Dessa forma não preciso, no próprio script php, ficar abrindo arquivos (fopen), escrevendo (fwrite) e me preocupando em fechá-los (fclose) assim que finalizar a execução, até porque é uma execução que pode ser finalizada em vários pontos.

O script shell ficou parecido com isso:

#!/bin/sh

BARRA="-------------------------------------\n";
START="`date +%Y-%m-%d\ %R:%S`";
YEARMONTHDAY="`date +%Y-%m-%d`";

# Configs
PHP_LOCAL="/usr/local/bin/php"
CRON_FILE="/home/usuario/public_html/projeto/cron/cron.php"
LOG_FILE="/home/usuario/public_html/projeto/var/cron_$YEARMONTHDAY.log";

$PHP_LOCAL $CRON_FILE >> $LOG_FILE

O arquivo cron.php contém o script que você deve executar. Lá você deve descrever cada atividade que está sendo realizada, imprimindo na tela com o echo do próprio php. Lembre-se que as quebras de linha devem ser com \n e não o br do HTML.

Agora, ao invés de colocar no cron do seu servidor o cron.php, você coloca esse arquivo.sh que você criou.

Sempre que o script for executado, um arquivo de log será criado com a saída do script executado. Se o arquivo de log para aquele dia já existe, ele irá concatenar as saídas, ou seja, você terá o log de todas as execuções.

Segurança

Para evitar que consigam ver esse seu arquivo e possam usá-lo para alguma ação indesejada, proíba que ele seja exibido. Para isso, crie um arquivo .htaccess, se não existir, com o seguinte conteúdo:

<Files *.sh>
  Order Deny,Allow
  Deny from all
</Files>

Dicas

Para descobrir onde o php está em seu servidor, no SSH, digite: whereis php.

Já para descobrir qual o path completo até o seu sistema, digite: pwd.