Como configurar um cron job root corretamente

Como configurar um cron job root corretamente

Tentei configurar um cron job root para executar um script Bash como root, para rodar no minuto 7,37, a cada hora, todos os dias do mês, todos os meses. Este script está localizado /usr/bine nomeado tunlrupdate.sh. Ele 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ívelaqui.

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

Para adicionar este cron job root eu usei o padrão para o crontab do root

sudo crontab -e

E inseri essas 2 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 -lconfirmou que o cron job foi inserido.

Eu reiniciei o Ubuntu e estava verificando no arquivo de log se o cron job foi iniciado corretamente. No entanto, não há nada no arquivo de log /var/log/tunlr.logque signifique que o trabalho nunca foi iniciado com êxito.

Eu verifiquei se eu executar o script na 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á funcionando conforme planejado em meu sistema?

ATUALIZAÇÃO 1: Todas as soluções propostas até agora não funcionam. Agradeço ao Olli por uma CLI para listar o log do sistema sudo grep CRON /var/log/syslog. No entanto, 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 a sugestão PATH= inserção e uso do caminho absoluto da raiz para funções no script ou sem essas soluções sugeridas aqui. Ainda recebo esse erro.

Depois de algumas pesquisas, localizei o erro no arquivo /usr/lib/php5/maxlifetimeconforme explicadoaqui:Change #!/bin/sh -e --> #!/bin/sh -x

Em seguida, listando o log de erros CRON em 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 às três linhas a seguir:

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

Ainda não concluí o cron job. Nada está escrito no arquivo de log. Então, mesmo que um script vazio não seja executado no cron? Eu não entendo. Estou tentando um script reduzido a estas 2 linhas:

#!/bin/bash
exit 0

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

Responder1

Se você quiser executar um script como umusuário normal:

crontab -e

E adicione a linha:

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

Se você quiser executar seu script comoraiz:

sudo crontab -e

E adicione a mesma linha:

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

Responder2

Bem, finalmente a solução funcional. No syslog 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 já usei o cron do root usando $ sudo /usr/bin/tunlrupdate.sh. Então tentei com o script original (corrigido por um erro na data UNIX cmd: %m que é mês foi usado para 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 por ser a solução final. [Embora eu tenha encontrado muita literatura afirmando a linha errada com root na linha cron. Isso foi um erro].

Responder3

Um "problema" com o cron é que a falta de variáveis ​​de ambiente (poróbviorazões de segurança). Provavelmente está faltando PATH e HOME. Você pode defini-los diretamente no script 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.

Responder4

Você pode adicionar esta linha em seu script. Então, depois de verificar os logs do cron e confirmar que seu trabalho foi executado, você pode obter o mesmo $PATH dos 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 em seu script. Então basta adicionar esta linha ao seu script. Então você pode analisar a saídaallEvnVars.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 ser executado a cada minuto para facilitar os testes e verificações.

*/1 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log

informação relacionada