Cron não está executando comandos como root

1

Eu tenho um arquivo chamado /scripts/checkInternet e contém:

#!/bin/bash
WGET="/usr/bin/wget"

rm /tmp/index.google
$WGET -q --tries=10 
           --timeout=5 http://www.google.com -O /tmp/index.google &> /dev/null
if [ ! -s /tmp/index.google ];then
        echo "Nope"
        ifdown eth0.4
        ifup eth0.4
        iptables-restore < /etc/iptables.rules
else
        echo "Connected"
fi
rm /tmp/index.google

Eu fiz chmod +x 755 este arquivo. Eu posso executá-lo como root, mas adicioná-lo a um cron como root não funciona.

O que deu errado? O cron em si está sendo executado. Eu vejo CMD (/scripts/checkInternet) em meus logs de sistema, mas o resultado desejado está faltando.

    
por gideon 14.03.2012 / 04:55

2 respostas

4

99% de todos os problemas que executam coisas do cron são causados por causa do $PATH inválido. Estou apostando que ifdown , ifup e iptables-restore estão ausentes do padrão $PATH . Você precisa especificar o caminho absoluto para estes.

    
por 14.03.2012 / 05:01
1

The cron itself is being run. I see CMD(/scripts/checkInternet) in my system logs but the desired outcome is missing.

Pense nisso por um momento. Se o seu script gerar resultados ou erros, onde você esperaria que a saída fosse enviada?

Na maioria dos sistemas Linux / Unix, se o seu script produzir alguma saída (por exemplo, Qualquer saída para STDOUT ou algum erro para STDERR), ela será enviada por e-mail para o proprietário do crontab. Na maioria dos casos, isso é 'root'.

Debian página man do cron diz:

cron will look at MAILTO if it has any reason to send mail as a result of running commands in "this" crontab. If MAILTO is defined (and non-empty), mail is sent to the user so named. If MAILTO is defined but empty (MAILTO=""), no mail will be sent. Otherwise mail is sent to the owner of the crontab.

Portanto, verifique o correio para o usuário que possui este crontab ou para o usuário especificado por MAILTO. Esse email deve conter o erro que você está procurando.

Durante o teste, eu pessoalmente prefiro enviar qualquer erro ou erro para um arquivo, como este:

   5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1

Ou eu envio para syslog usando o logger , assim:

   5 0 * * *       $HOME/bin/daily.job 2>&1 | logger

E, em seguida, execute tail -f logfile em uma segunda janela.

    
por 14.03.2012 / 05:07