Onde os erros do cron são registrados?

151

Se eu configurar cron trabalhos incorretamente, eles parecem falhar silenciosamente. Onde devo procurar um log de erro para entender o que deu errado?

    
por Brian Lyttle 11.08.2010 / 04:19

9 respostas

98

Como outros apontaram, cron enviará por e-mail a saída de qualquer programa executado (se houver alguma saída). Então, se você não obtiver nenhuma saída, existem basicamente três possibilidades:

  1. crond não conseguiu nem iniciar um shell para executar o programa ou enviar email
  2. crond teve problemas ao enviar a saída ou a correspondência foi perdida.
  3. o programa não produziu nenhuma saída (incluindo mensagens de erro)

Caso 1. é muito improvável, mas algo deveria ter sido escrito nos logs do cron. O Cron tem um próprio recurso de syslog reservado, então você deve dar uma olhada em /etc/syslog.conf (ou o arquivo equivalente em sua distro) para ver 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 linha MAILTO=... no arquivo crontab para que o cron envie um e-mail para um endereço específico, o que deve facilitar o grep 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 crond executou algo observando o mtime de /tmp/a_command_has_run .

    
por 11.08.2010 / 22:27
36

Se você não estiver vendo os e-mails, pode estar enviando spam para sua empresa com os erros que podem ser muito irritantes para as pessoas que usam essa conta para monitoramento. 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 erros com apenas 1-2 linhas de comprimento, como "yourcronjob: comando not found". Ele também faz uso de sua infra-estrutura de syslog existente (Logrotation, syslogging central, Splunk, etc.) Também reduz spam de e-mail para root.

Pode não ser uma boa solução se o seu cronjob gerar centenas de linhas de saída.

    
por 11.08.2010 / 20:23
33

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 superará o comportamento de e-mail mencionado anteriormente, porque o crond iself não receberá nenhuma saída do trabalho. Se você quiser manter esse comportamento, você deve olhar para tee (1).

    
por 11.08.2010 / 07:40
9

A configuração padrão do cron enviará um e-mail com a saída do seu programa. Se isso falhar, você pode tentar quebrar seu programa com falha em um script de shell que garanta que o programa não falhe, e você pode registrar mais a saída.

Esta é uma configuração configurável em algumas implementações do cron.

    
por 11.08.2010 / 04:52
6

Você deve receber um email de crond quando o trabalho não for executado ou quando o trabalho 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 mensagens na maioria dos sistemas Unixlike. É muito primitivo pelos padrões modernos, mas você pode contar com isso para estar sempre disponível. Outros agentes de email melhores podem estar disponíveis, mas há muitos deles que você nunca sabe qual deles está instalado em alguma máquina aleatória que esteja usando.

Observe que, a menos que você tenha configurado o sistema como um servidor de e-mail da Internet, este subsistema de e-mail será usado somente dentro da máquina. Você pode enviar e-mails para e receber de outros usuários na máquina, mas talvez não seja possível enviar e-mails para o mundo e os e-mails do mundo externo certamente não poderão ser acessados em sua máquina.

    
por 11.08.2010 / 04:50
5

Cron registra informações básicas em /var/log/messages , mas envia qualquer saída do programa para o usuário invocador.

    
por 11.08.2010 / 06:46
2

Eu tropecei neste tópico há alguns anos experimentando os mesmos problemas e recentemente encontrei uma solução para os casos mencionados acima por Ricardo. A falta de um e-mail é difícil de detectar (como você mencionou) e você certamente não quer enviar spam para seu e-mail root @ yourcompany. Se estiver interessado, confira deadmanssnitch.com. . Esta ferramenta parece resolver os casos acima mencionados. Parece muito simples de usar - basta adicionar o bit de código que a ferramenta lhe dá ao seu cronjob. Se o seu trabalho não for executado em um interno especificado, você será alertado. Se o seu trabalho começar a funcionar novamente, você também será alertado.

    
por 06.06.2014 / 18:21
1

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

Na minha pasta /root/ , tenho crons.cron , que defini como meu crontab executando crontab /root/crons.cron . dead.letter será criado em /root/ também.

Editar Eu só usei o Google dead.letter e é um e-mail não entregue. Não tem nada a ver com cron aparentemente. Se você não tiver o e-mail configurado corretamente (como eu), você terá o arquivo.

    
por 10.03.2011 / 20:33
0

Para iniciantes, isso pode ser difícil de depurar. Certifique-se de não trocar os valores de minuto e hora. O minuto vem primeiro, depois a hora. Quando você fornecer valores menores que 12 para cada, eles serão aceitos, mas poderão não funcionar como esperado ou de qualquer forma.

    
por 06.11.2018 / 11:56