Registrando TODA a saída stderr do crontab para arquivo

12

Por exemplo, eu posso registrar stderrum script desta maneira:

* * * * * run_script.sh > /var/log.txt 2>&1

Mas quero registrar stderrtodos os scripts no meu crontab. Posso anexar > /var/log.txt 2>&1a todos os scripts, mas não é bom se eu tiver centenas de scripts cron. Existe outra maneira mais simples de fazer isso?

Maslov Anton
fonte

Respostas:

6

No crontab, você pode configurar o MAILTO para apontar para um alias de email que executa um script. Esse script aceitaria uma mensagem de correio, removeria os cabeçalhos e outras ilusões e registraria o restante no logger. Como toda a saída do script cron é enviada para o endereço especificado por MAILTO, você captura tudo.

Exemplo: no crontab

MAILTO=myalias

Em / etc / mail / aliases (supondo que você esteja usando o sendmail)

myalias:"|/usr/local/bin/my-processing-script.sh"

e faça com que o script retire os cabeçalhos de email e processe a saída do cron.

Kyle Jones
fonte
você pode ser mais específico sobre como configurar o MAILTO, alias, MTA, script, etc?
endolith 29/11
1
Editei a resposta para fornecer uma configuração básica que deve funcionar para o sendmail e os MTAs amplamente compatíveis. Você terá que escrever o script você mesmo.
Kyle Jones #
5

Qualquer saída produzida por um comando é enviada ao usuário especificado na variável de ambiente MAILTO conforme definido no arquivo crontab (5) ou, se nenhuma variável MAILTO estiver configurada (ou se for um trabalho em (1) ou em lote (1) ), para o proprietário do trabalho. Se um comando não produzir saída ou se a variável de ambiente MAILTO estiver configurada para a sequência vazia, nenhum email será enviado.

Como ele usa correio local, você realmente não precisa configurar nada, ou talvez apenas instalar o mailx se ele ainda não estiver aqui. Cron lhe enviará a saída, você pode salvar o correio em um arquivo e fazer muitas coisas a partir daí. Tentar modificar a maneira como o cron funciona para atender diretamente às suas necessidades não é o caminho a seguir. Se você não acha, basta corrigir e recompilar o cron, chame-o de my_cron e use-o em vez de cron. E esteja preparado para manter seu my_cron atualizado e reconstruí-lo com frequência.

Adicione isso no início de todos os seus scripts para registrar tudo e parar no primeiro erro

exec 2>&1 > /var/log/YOUR_LOG_FILE
set -e
Aki
fonte
a ordem de redirecionamento deve ser o oposto? > /var/log/YOUR_LOG_FILE 2>&1ou seja, primeiro redirecione o stdout para um arquivo e só depois redirecione o stderr para o stdout (que agora aponta para o arquivo).
JFS
É muito louco que, em um servidor mínimo, você precise instalar um serviço de correio e, possivelmente, um cliente de correio, apenas para ler os erros produzidos pelo Cron. Parece uma decisão de design anarquista.
James McMahon
0

O script de Ryan Ye em /programming//a/7145618/20774 também é útil para isso, embora faça stdout e stderr.


Eu tenho um pequeno script cronlog.sh para fazer isso. O código do script

#!/bin/sh
echo "[`date`] Start executing $1"
$@ 2>&1 | sed -e "s/\(.*\)/[`date`] \1/"
echo "[`date`] End executing $1"

Então você poderia fazer

cronlog.sh /opt/scripts/sql_fetch >> your_log_file

Resultado de exemplo

cronlog.sh echo 'hello world!'

[Mon Aug 22 04:46:03 CDT 2011] Start executing echo
[Mon Aug 22 04:46:03 CDT 2011] helloworld!
[Mon Aug 22 04:46:03 CDT 2011] End executing echo
James McMahon
fonte