a tabela cron mailx causou conteúdo vazio

1

Estou usando o centos 7.0 / 6.5. O conteúdo do /etc/cron.hourly/mail.cron

#!/bin/sh
log=/var/log/mail.cron.log
echo "'hostname' 'date'" >> $log 2>&1
mailx -s "test mail" [email protected] < $log

O resultado de /var/log/mail.cron.log

myhost Mon Jul 28 11:01:01 CST 2014

Mas eu recebi um e-mail vazio, com o assunto correto. Então, eu testo esse cron manualmente. Eu tenho o conteúdo correto de e-mail.

myhost Mon Jul 28 11:01:01 CST 2014
myhost Mon Jul 28 11:30:29 CST 2014

Aqui está o log relacionado / var / log / cron

Jul 28 11:01:01 myhost run-parts(/etc/cron.hourly)[24577]: starting mail.cron
Jul 28 11:01:02 myhost run-parts(/etc/cron.hourly)[24605]: finished mail.cron

Pergunto-me como depurar este problema.

    
por Daniel YC Lin 28.07.2014 / 05:34

3 respostas

2

Algumas coisas para tentar.

  1. ! / bin / sh -xv

  2. Tente redirecionar stderr com dois maiores que os sinais, 2 > > & 1;

O primeiro fornecerá o resultado passo-a-passo do seu script. Eu tentaria primeiro sem redirecionar o stderr para o seu arquivo de log. O Cron deve enviar-lhe uma cópia da saída. Você pode ver exatamente onde isso está errado.

O segundo. Talvez você tenha um erro que está atingindo sua stdout? (Provavelmente não, funciona como você tem no CentOS 6.5.)

Você também pode verificar caracteres não imprimíveis usando cat.

cat -vet /etc/cron.hourly/mail.cron

Ainda outra coisa a tentar é usar caminhos absolutos para seus comandos, / bin / echo em vez de echo, / bin / date em vez de data, / bin / hostname em vez de hostname. (ymmv) Jim está absolutamente correto no cron nem sempre usa o ambiente exato como o mesmo usuário interativo.

    
por 28.07.2014 / 18:19
1

Você tem certeza de que o trabalho cron funciona, de acordo com seus comentários. No entanto, você testou manualmente a execução do trabalho enquanto está conectado. A questão é que as tarefas executadas por cron não levam em consideração as configurações e as variáveis de ambiente que você tem com o usuário atual, então você provavelmente precisará fornecer o arquivo .bash_profile settings para o usuário como uma etapa antes de enviar o e-mail no seu script.

Altere seu script para isso:

#!/bin/sh
source $HOME/.bash_profile     # or whatever profile file or setting you are using
log=/var/log/mail.cron.log
echo "$(hostname) $(date)" >> $log
mailx -s "test mail" [email protected] < $log

cron não sabe nada sobre o seu shell - ele é iniciado pelo sistema, então ele tem um ambiente mínimo. Se você quiser que ele possa encontrar seus programas ou executar utilitários instalados em seu sistema, você deve deixá-lo saber onde eles estão em primeiro lugar, e você pode fazer isso definindo as variáveis .profile no início de seu programa. roteiro.

Alguns links úteis:

por 29.07.2014 / 07:50
0

Eu vi que você tem algumas respostas, mas não uma resposta clara de trabalho. O que funcionou para mim foi definir o cron desta maneira:

* / 5 * * * * /fullpath/cron.sh | (body="$ (cat)"; if [[-n $ body]]; em seguida, echo "$ body" | mail -s "Saída do script Cron" [email protected]; fi)

isto captura a saída e envia-a para o correio sem ela Eu recebo um email vazio mesmo quando estou executando em um script. (graças a colucix)

    
por 13.05.2016 / 13:34