Como posso saber quando um trabalho cron foi morto ou caiu?

6

Normalmente, quando uma falha do cron job, ele deixa algumas mensagens de erro no log.

Nós executamos o shell script e algum programa java com o cron job. Recentemente descobrimos alguma coisa estranha no log. Obviamente, o programa foi danificado ou morto porque existe um bloqueio de programa que definimos quando o programa foi iniciado, o que não foi liberado. Nós achamos que o programa foi morto porque o log do programa não mostrou a mensagem final.

Quem pode ter matado o trabalho e como posso ser notificado por e-mail quando um trabalho do cron está morto?

EDIT: Eu não quero que o crontab receba e-mails, porque apenas envia cada saída padrão para o e-mail. No meu caso, há muitas outras saídas do sistema de um programa diferente, porque algumas delas não estão usando log4j ou são ecoadas pelo shell script. Como existem muitos usuários no sistema, não podemos exigir que todos os usuários gerenciem a saída padrão do programa.

    
por lamwaiman1988 23.12.2011 / 02:32

2 respostas

5

Para depurar isso, você pode colocar

set -e -u

na parte superior de seu script de shell - ele termina com um status de saída de erro quando um comando falha ou uma variável indefinida é usada.

Então você pode chamar do cron-job um script wrapper que chama o script principal como este

sh -x main_script.sh || echo Failed with exit status: $?

Com -x , cada linha é impressa antes de ser executada. A saída é enviada pelo daemon do cron para você.

Você também pode usar um arquivo temporário quando a saída for muito grande:

sh -x main_script.sh > $TEMPFILE 2>&1
if [ $? -ne 0 ]; then echo Failed with exit status $? - see $TEMPFILE; fi

Caso o status de saída seja > 128 , o comando foi interrompido por um sinal - por exemplo, alguém 'matou' isso, ocorreu uma falha de segmentação ou houve uma situação de falta de memória ( como obter o sinal do status de saída ).

    
por 23.12.2011 / 09:44
5

Verifique seus registros do sistema. Quais logs para verificar dependem da sua instalação; no Debian com a configuração padrão, você tem:

  • em /var/log/auth.log , avisos de quando o trabalho cron começou e terminou, porque o trabalho envolveu uma sessão do PAM;
  • em /var/log/syslog , um aviso de que grandchild #32283 failed with exit status 1 .
  • um aviso adicional em /var/log/kern.log se o seu processo foi encerrado pelo assassino da OOM.

Você receberá um e-mail do cron se o seu cron job produzir alguma saída em sua saída padrão ou erro padrão (a menos que seu sistema de entrega de e-mail local não esteja configurado corretamente). Você não receberá um e-mail se retornar silenciosamente um status diferente de zero (o que inclui o caso de ser morto por um sinal). Se você quiser um aviso, organize um wrapper de shell que seja barulhento em caso de erro, por exemplo,

42 1 * * * /path/to/real/job || echo $?

Se você quiser registrar mais informações sobre processos e como eles morrem (e como eles nascem, mas aqui você já sabe), consulte Existe um log de segmentos anteriores que estão agora fechados?

    
por 24.12.2011 / 00:02

Tags