Como configurar corretamente uma tarefa cron do root

21

Eu tentei configurar um agendamento do cron para executar um script Bash como root, para correr no minuto 7,37, cada hora, cada dia do mês, a cada mês. Este script está localizado em /usr/bin e denominado tunlrupdate.sh . Atualiza o DNS do Tunlr.

$ ls -l /usr/bin/tunlrupdate.sh 
-rwxr-xr-x 1 root root 2133 Sep 24 15:42 /usr/bin/tunlrupdate.sh

Este script Bash está disponível aqui .

Quando chamado o script escreve o que está acontecendo em um log localizado em /var/log/tunlr.log

Para adicionar este trabalho cron do root, usei o padrão para o crontab do root

sudo crontab -e

E inseriu essas duas linhas no final. Espero que o cron execute o script como root.

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * root /usr/bin/tunlrupdate.sh

Um comando posterior sudo crontab -l confirmou que o cron job foi inserido.

Eu fiz reiniciar Ubuntu e foi o check-in o arquivo de log se o trabalho cron foi lançado corretamente. No entanto não há nada no arquivo de log /var/log/tunlr.log o que significa que o trabalho nunca foi lançado com sucesso.

Eu verifiquei se eu executasse o script pela linha de comando

sudo /usr/bin/tunlrupdate.sh

então o arquivo de log é atualizado de acordo.

Por que esse cron job não está sendo executado como planejado no meu sistema?

UPDATE 1: Todas as soluções propostas até agora não funcionam. Agradeço a Olli por uma CLI para listar o log do sistema sudo grep CRON /var/log/syslog . No entanto, eu recebi um erro CRON

CRON[13092]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ]
&& find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php
/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete)

com o caminho sugerido = inserção & amp; uso de caminho absoluto da raiz para funções no script ou sem as soluções sugeridas aqui. Eu ainda recebo este erro.

Depois de algumas pesquisas eu identificou o erro no arquivo /usr/lib/php5/maxlifetime , como é explicado aqui : Change #!/bin/sh -e --> #!/bin/sh -x

Em seguida, listando o log de erros CRON no meu sistema

sudo grep CRON /var/log/syslog
Feb 11 18:07:01 Marius-PC CRON[14067]: (root) CMD (root /usr/bin/tunlrupdate.sh)
Feb 11 18:07:01 Marius-PC CRON[14066]: (root) MAIL (mailed 1 byte of output; but got
status 0x00ff, #012)

Ainda não consigo executar o script bash. Desta vez, nenhum erro é mostrado no log. Para ter certeza de que esse não era o conteúdo do script, reduzi o script para as três linhas a seguir:

#!/bin/bash
LOGFILE=/var/log/tunlr.log
echo $LOGFILE >> $LOGFILE

Ainda não consigo o trabalho do cron. Nada é escrito no arquivo de log. Então, mesmo pode ser um script vazio não será executado no cron? Eu não entendo. Estou sabendo tentar um script reduzido para estas 2 linhas:

#!/bin/bash
exit 0

E ainda o mesmo log de erro. O script cron não passa por ...

    
por Antonio 11.02.2014 / 19:01

5 respostas

6

Bem, finalmente a solução de trabalho. No syslog eu vi o repetitivo e intrigante:

CRON[18770]: (root) CMD (root /usr/bin/tunlrupdate.sh)

Parece que o root não foi reconhecido como um cmd. Como eu já usei o cron da raiz usando $ sudo /usr/bin/tunlrupdate.sh . Então eu tentei com o script original (corrigido por um erro na data cmd UNIX:% m, que é o mês foi usado por minutos, que é% M) o seguinte (que remove a raiz da linha cron):

$ sudo crontab -e
# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * /usr/bin/tunlrupdate.sh

Esta acabou sendo a solução final. [Embora eu encontrei dezenas de publicações informando a linha errônea com raiz na linha cron. Isso foi um erro].

    
por Antonio 12.02.2014 / 02:12
47

Se você deseja executar um script como um usuário normal :

crontab -e

E adicione a linha:

07,37 * * * * /usr/bin/tunlrupdate.sh

Se você deseja executar seu script como root :

sudo crontab -e

Adicione a mesma linha:

07,37 * * * * /usr/bin/tunlrupdate.sh
    
por Guillaume 26.09.2014 / 14:01
2

Um "problema" com o cron é a falta de variáveis ​​de ambiente (por razões de segurança óbvias ). Você provavelmente está faltando PATH e HOME. Você pode definir aqueles no script diretamente ou no arquivo crontab.

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
PATH=/usr/bin
07,37 * * * * root /usr/bin/tunlrupdate.sh

Você terá que testar até que todas as variáveis ​​necessárias sejam definidas conforme exigido pelo script.

    
por Alexis Wilke 11.02.2014 / 19:47
0

As mensagens de erro do Cron são normalmente - por padrão - enviadas por email. Você pode verificar se há e-mail para root com sudo mail ou apenas verificando o conteúdo de /var/mail/root , por exemplo, sudo less /var/mail/root .

Se as mensagens de e-mail não ajudarem, verifique também /var/log/syslog :

sudo grep CRON /var/log/syslog

Como Alexis Wilke já disse, o cron tem um mecanismo diferente para configurar variáveis ​​de ambiente.

Seu script precisa

PATH=/sbin:/bin:/usr/bin

para o crontab. HOME não deveria ser necessário. Você deve usar caminhos absolutos em seus scripts, por exemplo, /bin/date em vez de date . Você pode encontrar caminhos adequados para cada comando com which command_name , por exemplo

$ which date
/bin/date
    
por Olli 11.02.2014 / 20:09
0

Você pode adicionar esta linha ao seu script. Então, depois de verificar os logs do cron e comprove que seu trabalho foi executado, você pode obter o mesmo $ PATH de crontabs.

/bin/echo $PATH > /root/path.txt

E, provavelmente, a melhor coisa que você pode fazer para diagnosticar problemas em scripts cron é obter todas as variáveis ​​de ambiente do SO com o comando env no seu script. Então, basta adicionar essa linha ao seu script. Então você pode analisar a saída allEvnVars.txt

/usr/bin/env > /root/allEvnVars.txt

Outro truque é direcionar a saída do script para algum lugar. Adicionando o /root/log.log . Desta forma, toda a saída do script será mantida em /root/log.log

07,37 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log

Além disso, você pode agendar o script para executar cada min para facilitar os testes e verificações.

*/1 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log
    
por Cassio Seffrin 01.06.2015 / 03:54

Tags