Usando uma declaração If no Crontab para gerar um alerta

3

Eu tenho um servidor no qual existem cerca de 100 empregos Cron que executam vários scripts PHP. A tarefa em mãos é gerar um alerta sempre que ocorrer um erro na execução de um script PHP.

Os Crons são definidos da seguinte forma:

30 08 * * * /usr/bin/php /var/www/html/phpscirpt1.php > /var/www/html/phpscript1.log 2>&1

O que tentei é colocar um && no final, mas isso gera o E-mail de Alerta de qualquer maneira

30 08 * * * /usr/bin/php /var/www/html/phpscript1.php > /var/www/html/phpscript1.log 2>&1 && <Generate Mail>

O caso ideal que deveria funcionar seria

 /bin/bash /home/myUser/testfile.sh > /home/myUser/testfile.log 2>&1 ; [$? == 1] && /bin/bash script.sh

O seguinte é apenas uma amostra para fins de teste, quando

/bin/bash /home/myUser/testfile.sh > /home/myUser/testfile.log 2>&1

é executado testfile.sh cria apenas um diretório. Quando o comando acima é executado na primeira vez, echo $? fornece a saída 0 , mas a execução do comando retorna novamente 1 , porque os scripts retornam e registram um erro

mkdir: cannot create directory '/home/myUser/testdir': File exists

E, basicamente, isso é o que é necessário, sempre que o script em um cron falhar, ele deve gerar um alerta na forma de um e-mail. No exemplo acima, script.sh contém um comando mail -s para enviar o e-mail.

Mas quando o comando complete é executado, um erro é retornado, que é o seguinte

/bin/bash /home/myUser/testfile.sh > /home/myUser/testfile.log 2>&1 ; [$? == 1] && /bin/bash script.sh
-bash: [1: command not found

Eu apreciaria muito qualquer orientação que pudesse ser fornecida para resolver esse erro. Obrigado

    
por Mustafa Mujahid 15.09.2016 / 08:13

2 respostas

2

Basicamente, sua solução é boa. Você acabou de fazer um erro simples de sintaxe de bash. Você precisa colocar espaços em volta dos caracteres '[' e ']':

[ $? == 1 ]

Eu testei na minha caixa e funciona. Sugiro também testar o código de erro como diferente de 0 ( [$? -Ne 0] ), a menos que você tenha certeza de que deseja reagir apenas no código de erro 1.

    
por 15.09.2016 / 09:01
0

Qualquer um dos itens a seguir deve funcionar:

30 08 * * * /usr/bin/php /var/www/html/phpscript1.php > /var/www/html/phpscript1.log 2>&1 || <Generate Mail>
30 08 * * * /usr/bin/php /var/www/html/phpscript1.php > /var/www/html/phpscript1.log 2>&1 ; [ $? -ne 0 ] && <Generate Mail>

O primeiro usa um OR lógico || em vez do lógico AND && que é baseado no valor de retorno do seu script (0 é sucesso, qualquer outra coisa é falha).

O segundo precisava de um espaço entre o [ e o $? para funcionar corretamente.

    
por 15.09.2016 / 09:05