Cronjob não está executando o script

1

Eu criei um script para obter meu endereço IP externo, verifique se ele foi alterado e, se houver, envie-o por e-mail para mim.

Aqui está o script, apropriadamente chamado ip.sh (nome do host do servidor é "odin"):

#!/bin/sh

# Start by renaming file "current-ip" to "old-ip"
mv -f  /var/www/html/scripts/current-ip  /var/www/html/scripts/old-ip
# Create new "current-ip" with the email's subject line
echo 'Subject: Odin has a new IP address' >> /var/www/html/scripts/current-ip
# Add a blank line
echo '' >> /var/www/html/scripts/current-ip
# Add some text to make the email slightly more readable
echo 'It seems as if a new IP address as been assigned to Odin:' >> /var/www/html/scripts/current-ip
# Get my external IP address and add it to a new line
curl http://ipecho.net/plain -w "\n" >> /var/www/html/scripts/current-ip
# Set permission to make the file readable and writeable
chmod 766 /var/www/html/scripts/current-ip

# Check to see if the newly built "current-ip" matches the old file
if diff /var/www/html/scripts/current-ip /var/www/html/scripts/old-ip >/dev/null ; then
# if it does, do nothing
exit
# Otherwise send that email!
else
  ssmtp -F"Odin" [email protected] < /var/www/html/scripts/current-ip
fi

Então, para testar isso, vou editar o arquivo ip atual para outra coisa e depois executar o script ./ip.sh e ele funciona como um encanto, recebo meu e-mail de "Odin" dizendo qual é o novo endereço IP . Fantástico.

Então, agora, eu crio um symlink:

ln /var/www/html/scripts/ip.sh /sbin/odinip

E teste-o executando odinip . Funciona perfeitamente.

Então eu vou criar o cronjob com crontab -e e digite a seguinte linha:

*/5 * * * * /sbin/odinip

Eu também adiciono a seguinte linha para garantir que o cron esteja funcionando:

*/5 * * * * env > /var/www/html/scripts/env.output

Eu então edito o arquivo current-ip novamente para ter certeza de que haverá uma diferença quando o cronjob for executado.

Então eu espero e espero e espero. O arquivo env.output é criado, mas nenhum email é enviado.

Verificando o syslog ( tail -n25 /var/log/syslog ) eu recebo:

May  9 13:40:01 odin CRON[7371]: (root) CMD (env > /var/www/html/scripts/env.output)
May  9 13:40:04 odin CRON[7341]: (CRON) info (No MTA installed, discarding output)
May  9 13:40:38 odin crontab[7429]: (root) BEGIN EDIT (root)
May  9 13:40:47 odin crontab[7429]: (root) END EDIT (root)
May  9 13:40:49 odin crontab[7451]: (root) BEGIN EDIT (root)
May  9 13:41:01 odin CRON[7478]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh)
May  9 13:41:16 odin rsyslogd-2007: action 'action 17' suspended, next retry is Mon May  9 13:42:46 2016 [try http://www.rsyslog.com/e/2007 ]
May  9 13:41:30 odin crontab[7451]: (root) END EDIT (root)
May  9 13:41:31 odin crontab[7513]: (root) BEGIN EDIT (root)
May  9 13:41:44 odin crontab[7513]: (root) END EDIT (root)
May  9 13:41:46 odin crontab[7548]: (root) BEGIN EDIT (root)
May  9 13:42:01 odin CRON[7587]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh)
May  9 13:42:46 odin rsyslogd-2007: action 'action 17' suspended, next retry is Mon May  9 13:44:16 2016 [try http://www.rsyslog.com/e/2007 ]
May  9 13:43:01 odin CRON[7690]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh)
May  9 13:43:41 odin crontab[7548]: (root) REPLACE (root)
May  9 13:43:41 odin crontab[7548]: (root) END EDIT (root)
May  9 13:44:01 odin cron[360]: (root) RELOAD (crontabs/root)
May  9 13:44:01 odin CRON[7771]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh)
May  9 13:44:18 odin rsyslogd-2007: action 'action 17' suspended, next retry is Mon May  9 13:45:48 2016 [try http://www.rsyslog.com/e/2007 ]
May  9 13:45:01 odin CRON[7849]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh)
May  9 13:45:01 odin CRON[7850]: (root) CMD (/home/jim/duckdns/duck.sh >/dev/null 2>&1)
May  9 13:45:01 odin CRON[7851]: (root) CMD (/sbin/odinip)
May  9 13:45:04 odin CRON[7829]: (CRON) info (No MTA installed, discarding output)
May  9 13:45:51 odin rsyslogd-2007: action 'action 17' suspended, next retry is Mon May  9 13:47:21 2016 [try http://www.rsyslog.com/e/2007 ]
May  9 13:46:01 odin CRON[7943]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh)

cpuTemp.sh é apenas outro script que eu tenho executado lá. Talvez algo sobre não haver nenhum agente de transporte de email? Mas como funciona quando eu o executo manualmente?

Mais informações: todos os comandos são executados e os arquivos editados e as edições do crontab são executadas como raiz Tudo isso está acontecendo em um Rasberry Pi 2 rodando Jessie. MUITO recentemente atualizado e atualizado.

    
por Jim 09.05.2016 / 13:55

2 respostas

1

Oh, nossa. A resposta: use caminhos completos

Eu pensei que tinha feito exatamente isso, até que descobri que alguém tinha um problema usando o ssmtp diretamente do crontab.

Eles tinham:

0 9 * * * ssmtp [email protected] < /home/a/a-msg.txt

e teve que mudá-lo para

0 9 * * * /usr/sbin/ssmtp [email protected] < /home/a/a-msg.txt

O que aparentemente resolveu o problema.

Eu, por outro lado, estava referenciando o ssmtp do script bash ( ip.sh ) com a linha:

ssmtp -F"Odin" [email protected] < /var/www/html/scripts/current-ip

Então atualizei para

/usr/sbin/ssmtp -F"Odin" [email protected] < /var/www/html/scripts/current-ip

Alterado, o conteúdo do ip atual para forçar o else da instrução if a disparar e pareceu funcionar. Vou continuar testando e atualizando isso se eu encontrar outros bugs.

    
por 09.05.2016 / 15:47
0

O Cron não usa ou lembra seu ambiente ao executar os comandos, portanto, caminhos e outras variáveis de ambiente podem não ser o esperado.

Como você já parece ter descoberto, a melhor maneira de evitar problemas é sempre usar o caminho completo dos comandos executados pelo cron.

    
por 12.05.2016 / 15:26