Se eu configurar os cron
trabalhos incorretamente, eles parecerão falhar silenciosamente. Onde devo procurar um log de erros para entender o que deu errado?
Se eu configurar os cron
trabalhos incorretamente, eles parecerão falhar silenciosamente. Onde devo procurar um log de erros para entender o que deu errado?
Respostas:
Como outros já apontaram, cron
enviará por e-mail a saída de qualquer programa executado (se houver alguma saída). Portanto, se você não obtiver nenhuma saída, existem basicamente três possibilidades:
crond
não foi possível nem iniciar um shell para executar o programa ou enviar emailcrond
teve problemas enviando a saída ou o correio foi perdido.O caso 1. é muito improvável, mas algo deveria ter sido escrito nos logs do cron. O Cron possui um recurso de syslog reservado, portanto, você deve procurar /etc/syslog.conf
(ou o arquivo equivalente em sua distribuição) para ver para onde as mensagens do recurso cron
são enviadas. Destinos populares incluem /var/log/cron
, /var/log/messages
e /var/log/syslog
.
No caso 2., você deve inspecionar os logs do daemon do mailer: as mensagens do daemon Cron geralmente aparecem como de root@yourhost
. Você pode usar uma MAILTO=...
linha no arquivo crontab para que o cron envie um email para um endereço específico, o que deve facilitar a recepção dos logs do daemon do mailer. Por exemplo:
MAILTO=my.offsite.email@example.org
00 15 * * * echo "Just testing if crond sends email"
No caso 3., você pode testar se o programa foi realmente executado anexando outro comando cujo efeito você pode verificar facilmente: por exemplo,
00 15 * * * /a/command; touch /tmp/a_command_has_run
para que você possa verificar se crond
realmente executou alguma coisa, observando as horas de /tmp/a_command_has_run
.
dead.letter
no diretório raiz ou no diretório inicial do usuário.
Você sempre pode enviar explicitamente a saída do trabalho para um arquivo de log:
0 8 * * * /usr/local/bin/myjob > /var/log/myjob.log 2>&1
Lembre-se de que isso substituirá o comportamento do correio mencionado anteriormente, porque o próprio crond não receberá nenhuma saída do trabalho. Se você deseja manter esse comportamento, consulte o tee (1).
>>
vez de >
, para não sobrescrever o arquivo de log toda vez?
| /usr/bin/logger
que você deseje, como inteligentemente sugerido por Stefan. Escolha seu veneno: tldp.org/LDP/abs/html/io-redirection.html
myjob.log
com o tamanho 0, conforme o esperado, mas registrou-se em outro arquivo, onde posso alterar essa configuração?
Se você não estiver vendo os e-mails, poderá estar enviando spam para root @ yourcompany com os erros que podem ser bastante irritantes para as pessoas que usam essa conta para monitorar. Tente enviar a saída para o Syslog:
*/5 * * * * yourcronjob 2>&1 | /usr/bin/logger -t yourtag
Em seguida, aguarde a execução do cronjob e procure o erro em / var / log / messages (ou /var/log/user.log em alguns sistemas).
Isso funciona muito bem para mensagens de erro com apenas 1-2 linhas, como "yourcronjob: command not found". Ele também utiliza sua infraestrutura de syslog existente (Logrotation, syslogging central, Splunk etc.) e também reduz o spam de e-mail para o root.
Pode não ser uma boa solução se o seu cronjob gerar centenas de linhas de saída.
A configuração padrão do cron enviará um email com a saída do seu programa. Se isso falhar, você pode tentar agrupar seu programa com falha em um script de shell que garanta que o programa não falhe e poderá registrar ainda mais a saída.
Essa é uma configuração configurável em algumas implementações do cron.
Você deve receber um e-mail crond
quando o trabalho falhar na execução ou quando retornar um código de saída diferente de zero. Tente digitar:
$ mailx
no prompt de comando.
mailx(1)
é o programa básico de leitura de e-mail em quase todos os sistemas Unixlike. É muito primitivo para os padrões modernos, mas é possível contar com ele para estar sempre disponível. Outros agentes de correio melhores podem estar disponíveis, mas há um número suficiente deles para que você nunca saiba qual deles está instalado em alguma máquina aleatória que estiver usando.
Observe que, a menos que você tenha configurado seu sistema como um servidor de email na Internet, esse subsistema de email será usado apenas dentro da máquina. Você pode enviar e receber e-mails de outros usuários na máquina, mas talvez não seja possível enviar e-mails para o mundo, e e-mails do mundo exterior certamente não poderão chegar à sua máquina.
Cron registra informações básicas em /var/log/messages
, mas envia por e-mail qualquer saída do programa para o usuário que está chamando.
/var/log/messages
no meu servidor Ubuntu ( 4.4.0-128-generic #154-Ubuntu SMP
). Alguma idéia do porquê? Eu tenho alguns trabalhos cron definidos no root
crontab por meses (por exemplo apt autoremove
), mas nenhum parece ter sido executado.
Eu me deparei com esse tópico há alguns anos, enfrentando os mesmos problemas e, recentemente, deparei com uma solução para os casos mencionados por Ricardo. A falta de um email é difícil de detectar (como você mencionou) e você certamente não deseja enviar spam para o email root @ yourcompany. Se estiver interessado, verifique deadmanssnitch.com. . Essa ferramenta parece resolver os casos mencionados acima. Parece bastante simples de usar - basta adicionar o pouco de código que a ferramenta fornece ao seu cronjob. Se o seu trabalho falhar na execução em um interno especificado, você será alertado. Se o seu trabalho começar a ser executado novamente, você também será alertado.
Eu uso vixie-cron
, então não sei se isso se aplica a tudo. Mas eu tenho um dead.letter
arquivo que contém toda a saída do trabalho.
Na minha /root/
pasta, tenho o crons.cron
que defini como meu crontab executando crontab /root/crons.cron
. dead.letter
será criado /root/
também.
Editar
Acabei de pesquisar no Google dead.letter
e é um e-mail não entregue. Aparentemente, não tem nada a ver com o cron. Se você não tiver o correio configurado corretamente (como eu), terá o arquivo.
Para iniciantes, isso pode ser difícil de depurar. Certifique-se de não trocar os valores de minutos e horas. O minuto chega primeiro, depois a hora. Quando você fornece valores inferiores a 12 para cada um, ele os aceita, mas pode não funcionar como o esperado ou de maneira alguma.