Tentei configurar um trabalho cron do root para executar um script Bash como root, para executar no minuto 7,37, a cada hora, todos os dias do mês, todos os meses. Este script está localizado /usr/bin
e 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ível aqui .
Quando chamado, o script grava 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 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 -l
confirmou que o trabalho cron foi inserido.
Eu reiniciei o Ubuntu e estava verificando no arquivo de log se o trabalho cron foi iniciado corretamente. No entanto, não há nada no arquivo de log, o que /var/log/tunlr.log
significa que o trabalho nunca foi iniciado com êxito.
Eu verifiquei se eu executava o script na linha de comando
sudo /usr/bin/tunlrupdate.sh
o arquivo de log é atualizado de acordo.
Por que esse trabalho cron não está sendo executado conforme o planejado no meu sistema?
ATUALIZAÇÃO 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, 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 PATH sugerido = inserção e uso do caminho absoluto da raiz para funções no script ou sem as soluções sugeridas aqui. Eu ainda recebo esse erro.
Após algumas pesquisas, identifiquei o erro no arquivo, /usr/lib/php5/maxlifetime
conforme 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 obter garantia 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 recebi o trabalho do cron. Nada está escrito no arquivo de log. Então, mesmo pode ser um script vazio não será executado no cron? Eu não entendo. Eu sei que 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 por ...
Respostas:
Se você deseja executar um script como um usuário normal :
E adicione a linha:
Se você deseja executar seu script como root :
E adicione a mesma linha:
fonte
sudo crontab -e
vez decrontab -e
). Ou qualquer outra coisa, de qualquer maneira ele funcionaBem, finalmente a solução de trabalho. No syslog, vi o repetitivo e intrigante:
Parece que a raiz não foi reconhecida como um cmd. Como eu já usei o cron da raiz usando
$ sudo /usr/bin/tunlrupdate.sh
. Então tentei com o script original (corrigido um erro na data UNIX cmd:% m que é mês foi usado por minutos que é% M) o seguinte (que remove a raiz da linha cron):Isso acabou sendo a solução final. [Embora eu tenha encontrado várias publicações indicando a linha incorreta com raiz na linha cron. Isso foi um erro].
fonte
crontab
comando (exceto os arquivos crontab abaixo/etc
)./etc/crontab
(o crontab em todo o sistema). Usandosudo crontab -e
você está trabalhando com crontab do root, que normalmente pode ser encontrado em/var/spool/cron/crontabs
Um "problema" com o cron é a falta de variáveis de ambiente (por razões óbvias de segurança). Você provavelmente está perdendo PATH e HOME. Você pode definir aqueles no script diretamente ou no arquivo crontab.
Você precisará testar até que todas as variáveis necessárias sejam definidas conforme exigido pelo script.
fonte
/etc/crontab
arquivo e colei-as nosudo crontab -e
e o comando foi executado como root sem problemas. Obrigado!Geralmente, as mensagens de erro do Cron são enviadas por email. Você pode verificar se há um email para o root
sudo mail
ou apenas verificando o conteúdo de/var/mail/root
, por exemplosudo less /var/mail/root
.Se as mensagens de email não ajudarem, verifique também
/var/log/syslog
:Como Alexis Wilke já disse, o cron possui um mecanismo diferente para definir variáveis de ambiente.
Seu script precisa
para o crontab.
HOME
não deveria ser necessário. Você deve usar caminhos absolutos em seus scripts, por exemplo, em/bin/date
vez dedate
. Você pode encontrar caminhos adequados para cada comando comwhich command_name
, por exemplofonte
/var/mail/root
. Você pode consertar isso ou tentar com #PATH=...
Você pode adicionar esta linha no seu script. Portanto, depois de verificar os cron logs e confirmar que seu trabalho foi executado, você pode obter o mesmo $ PATH de crontabs.
E provavelmente a melhor coisa que você pode fazer para diagnosticar problemas nos scripts cron é obter todas as variáveis de ambiente do SO com o comando env no seu script. Então, basta adicionar esta linha ao seu script. Então você pode analisar a saída
allEvnVars.txt
Outro truque é direcionar a saída do script para algum lugar. Adicionando o
/root/log.log
. Dessa forma, toda a saída do script será mantida em/root/log.log
Além disso, você pode agendar o script para executar cada minuto para facilitar os testes e verificações.
fonte