Onde os erros do cron são registrados?

170

Se eu configurar os crontrabalhos incorretamente, eles parecerão falhar silenciosamente. Onde devo procurar um log de erros para entender o que deu errado?

Brian Lyttle
fonte

Respostas:

106

Como outros já apontaram, cronenviará 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:

  1. crond não foi possível nem iniciar um shell para executar o programa ou enviar email
  2. crond teve problemas enviando a saída ou o correio foi perdido.
  3. o programa não produziu nenhuma saída (incluindo mensagens de erro)

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 cronsão enviadas. Destinos populares incluem /var/log/cron, /var/log/messagese /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:

[email protected]
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 crondrealmente executou alguma coisa, observando as horas de /tmp/a_command_has_run.

Riccardo Murri
fonte
3
Esses "e-mails" também estão em um arquivo? Estou usando hospedagem compartilhada e acho que eles não saberiam para onde me enviar um e-mail.
Nathan Long
3
Agradeço o conselho no caso 3 para verificar se o comando está sendo executado. No meu caso, o cron não estava executando meu trabalho porque eu havia mudado recentemente o fuso horário do servidor e precisava reiniciar o servidor cron para avaliar os horários do cron no fuso horário apropriado.
22413 Nathan
1
Dependendo do seu agente de transferência de e-mail, você também pode encontrar e-mails não entregues em um arquivo chamado dead.letterno diretório raiz ou no diretório inicial do usuário.
Dario Seidl
43

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).

codehead
fonte
9
Por que não usar em >>vez de >, para não sobrescrever o arquivo de log toda vez?
31418 Chris
Certo! Qualquer tipo de redirecionamento de E / S funcionará, mesmo | /usr/bin/loggerque você deseje, como inteligentemente sugerido por Stefan. Escolha seu veneno: tldp.org/LDP/abs/html/io-redirection.html
codehead
O cron criou esse arquivo de log myjob.logcom o tamanho 0, conforme o esperado, mas registrou-se em outro arquivo, onde posso alterar essa configuração?
Accountant em 01/07
42

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.

Stefan Lasiewski
fonte
8

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.

miguel.de.icaza
fonte
7

Você deve receber um e-mail crondquando 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.

Warren Young
fonte
5

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.

Hemant
fonte
Não existe /var/log/messagesno meu servidor Ubuntu ( 4.4.0-128-generic #154-Ubuntu SMP). Alguma idéia do porquê? Eu tenho alguns trabalhos cron definidos no rootcrontab por meses (por exemplo apt autoremove), mas nenhum parece ter sido executado.
Dan Dascalescu
2

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.

ss_jt
fonte
1

Eu uso vixie-cron, então não sei se isso se aplica a tudo. Mas eu tenho um dead.letterarquivo que contém toda a saída do trabalho.

Na minha /root/pasta, tenho o crons.cronque defini como meu crontab executando crontab /root/crons.cron. dead.letterserá criado /root/também.

Editar Acabei de pesquisar no Google dead.lettere é 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.

jonescb
fonte
0

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.

Michael Woyo
fonte
2
Você está certo, mas não tenho certeza se isso realmente responde à pergunta.
roaima