Como posso visualizar os resultados dos meus trabalhos cron?


Respostas:


66

Verifique se os programas que você executa com o cron possuem seus próprios arquivos de log. Se não o fizerem, mas gravar sua saída nas saídas padrão, você poderá redirecioná-las para arquivos ou enviá-las por e-mail. O redirecionamento de shell padrão do crontabs interno funciona.

Por exemplo, para redirecionar a saída de erro de some_job.sha some_job.erre descartando a saída padrão (ou seja, enviá-lo para /dev/null) adicione o seguinte redirecionamento para o seu crontab

 33 3 * * * /path/to/some_job.sh 1> /dev/null 2> /other/path/to/some_job.err

ou enviá-lo para você (se mailestiver disponível)

 33 3 * * * /path/to/some_job.sh 1> /dev/null 2>&1 | mail -s "cron output" you@example.org

Foi assim que sempre resolvi meus problemas com o cron.
physicsmichael

Esse segundo exemplo está certo? Não redirecionaria tudo para /dev/null?
Timmmm

7
@ Timmmm: Eu trabalho. Primeiro, ele redireciona tudo, desde some_job.sho stdout para /dev/nulle somente depois do stderr para o stdout (que agora não contém mais nada). Dessa forma, apenas seu stderr termina em stdout e é repassado para mail.
Benjamin Bannier

9

A maioria dos daemons cron em plataformas com as quais trabalhei enviaram por email automaticamente o stdout / stderr dos trabalhos cron do usuário para o usuário de quem o trabalho foi feito. Eu esqueço o que acontece com todo o sistema (tarefas cron não específicas do usuário em / etc / crontab). O problema é que as pessoas nem sempre configuram um daemon de mala direta (ou seja, um MTA) como sendmail, qmail ou postfix) na maioria dos sistemas operacionais semelhantes ao Unix. Portanto, os emails de saída da tarefa cron simplesmente morrem em uma pasta de spool de email local em algum lugar, se eles chegarem tão longe. Portanto, uma resposta pode ser apenas para ativar o seu daemon de mala direta e talvez tenha um arquivo ~ / .forward para encaminhar sua correspondência local para a sua conta de email "real".

Se você deseja que seus trabalhos sejam gravados em arquivos de log específicos, é possível usar o redirecionamento de saída padrão, como @honk sugerido, ou, supondo que seu trabalho cron seja um script de shell, você pode ter seu log de chamadas de script (1) ou syslog (1) ou qualquer outra ferramenta de linha de comando que seu sistema operacional for capaz de enviar mensagens arbitrárias para o syslog. Então você pode usar os métodos internos do seu sistema operacional para configurar quais tipos de mensagens são registradas onde, talvez editando /etc/syslog.conf.

A maioria dos meus trabalhos cron invocam scripts bash que escrevi especificamente com a finalidade de serem iniciados pelo cron por um motivo específico. Nesses, especialmente quando eu estou escrevendo e depurando inicialmente, eu gosto de usar o "set -vx" do bash para fazer com que a forma expandida e não expandida de cada linha do script de shell seja gravada no stdout antes de ser executada. Observe que os scripts de shell iniciados no cron são considerados shells não interativos e sem logon; portanto, seus scripts de inicialização do shell padrão, como .bashrc e .profile, não são executados. Se você usa o bash e deseja que o bash execute um script de inicialização, defina uma variável de ambiente "BASH_ENV = / caminho / para / meu / inicialização / script" em seu crontab antes da linha em que você define o trabalho.


3
Isto está correto. Pode-se usar o mailcomando para ler mensagens da linha de comando. Ou olhe /var/spool/mail. Mas se você instalou o postfix ou outro mailer que não o sendmail padrão, é necessária outra maneira de ler as mensagens.
21415 akostadinov

Por que precisamos de um agente de serviço de correio apenas para isso? mail -s "cron output" test@example.comfunciona muito bem: /
Martin Konecny ​​21/03

No CentOS, minha saída cron é "enviada" para / var / spool / mail. Veja executando, less $MAILse você deseja ver a saída do cron para o usuário atual ou less /var/spool/mail/rootse deseja ver a saída do cron para comandos em execução como root.
Sffc 7/07

5

As tarefas que o cron está executando são responsáveis ​​por seu próprio log.


2

A maneira mais simples é capturar erros de impressão e salvar em um arquivo. Eu tenho um cronjob que chama uma linha de comando php, assim:

1 0 * * * php /pathOfMyApp/index.php controllerName functionName> / pathOfMyApp / log / myErrorLog 2> & 1

A parte antes de '>' é o meu cronjob e depois de '>' é a captura e o salvamento em um arquivo localizado em uma pasta de log na raiz do meu projeto, mas pode estar no local desejado. Esteja alerta: sempre que o cronjob for chamado, ele substituirá o último log. Você pode usar '>>' para escrever no final de um arquivo existente ou procurar o comando do terminal 'cat'.

Se o seu crontab usa 'curl' ou 'wget' e se refere a um link, você pode procurar em / var / log / httpd / appName por access-log, se o cron retornar com 500 ou 400 deve estar errado.

Por fim, você também pode verificar / var / log / messages.


1

Eu acho que redirecionar dentro do arquivo cron pode não ser a melhor opção neste caso.

Freqüentemente, você deseja que a especificação de log seja co-localizada com o script de tarefa cron. Nesse caso, sugiro o seguinte:

#!/bin/bash
exec &>> capture-log.txt
echo "Running cron-job foo at $(date)"
...
<rest of script>

Isso anexa a saída do trabalho cron ao arquivo capture-log.txt.


1

Prefiro receber relatórios por e-mail sobre trabalhos cron. Apenas coloque

MAILTO=seu email@domínio.com

no crontab e você receberá um email. Claro que você precisa ter o email configurado para sua conta.


Acho que isso costuma ser o mais fácil de ativar e desativar para depuração. Normalmente, uso apenas o nome de usuário @ localhost para o endereço de email.
Flickerfly
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.