Linux Bash condições IF não processadas quando executado como crontab

1

Então criei um pequeno script que monitora meus diretórios atendidos para quaisquer arquivos PHP que foram alterados. Ele foi projetado para ser executado a cada 5 minutos a partir do crontab e me envia qualquer alteração para que eu possa verificá-las.

Existem muitos sites em execução na máquina e eu quero ser capaz de dar uma olhada em qualquer novo script para ter certeza de que não há nada lá que eu não goste, se você sabe o que quero dizer .

O problema é que o script corre 100% bem quando eu o executo a partir da linha de comando, mas ele não roda corretamente a partir do crontab. O script está incluído abaixo:

rm /root/sec/email
find /var/www/ -name '*.php' -not -name '*.tpl.*' -type f -mtime -0.005 -exec ls -al {} \;  > /root/sec/email
if [[ -s /root/sec/email ]] ; then
        mail -s "PHP Change Alert on FSE4" [email protected] [email protected] < /root/sec/email
        echo "It ran" >> /root/sec/log
else
        echo "It did not run" >> /root/sec/log
fi ;

O problema é com a condição IF. Mesmo se o arquivo chamado "email" tiver um tamanho diferente de zero, o lado errado da cláusula if será acionado (o else).

Alguma idéia do que estou fazendo errado?

Felicidades,

Matt.

    
por Matt Rogers 31.01.2014 / 16:48

2 respostas

6

O script tem um fundamento básico: [[

Em outras palavras, o script está usando uma extensão não padrão para a sintaxe do shell Bourne, que quebra o script quando ele é executado por /bin/sh (suponho que sua distro usa um /bin/sh que não tem suporte para todos os bashismos não-POSIX nele).

Para resolver esse problema,

  1. Coloque #!/bin/bash como a primeira linha do script
  2. Torne a condição if semelhante a esta: if [ -s "/root/sec/email" ] ; then

Mais algumas informações sobre os bashismos estão aqui: link

    
por 31.01.2014 / 17:00
2

O Crontab usa / bin / sh por padrão para executar seus comandos.

Mesmo que / bin / sh seja um link simbólico para / bin / bash, o bash desativa os recursos somente do bash se for executado dessa forma.

De acordo com 'man 5 crontab', você pode colocar 'SHELL = / bin / bash' em uma nova linha no seu arquivo crontab e de repente os recursos bash funcionarão novamente, como o seu "if [[...] ] "declaração.

    
por 31.01.2014 / 22:12

Tags