!/bin/sh -xv

!/bin/sh -xv

Estou usando o centos 7.0/6.5. O conteúdo de /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 recebi um e-mail vazio, com assunto correto. Então, eu testo esse cron manualmente. Recebi o conteúdo correto do 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

Gostaria de saber como depurar esse problema.

Responder1

Algumas coisas para tentar.

  1. !/bin/sh -xv

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

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

O segundo. Talvez você tenha um erro que esteja prejudicando seu stdout? (Provavelmente não, funciona como no CentOS 6.5.)

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

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

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 em que o cron nem sempre usa o ambiente exato do mesmo usuário interativo.

Responder2

Você tem certeza de que o crontrabalho funciona, de acordo com seus comentários - no entanto, você o testou manualmente executando o trabalho enquanto estava conectado. O problema é que os trabalhos executados cronnão levam em consideração as configurações e variáveis ​​de ambiente que você tem com seu usuário atual, então você provavelmente precisará fornecer o .bash_profilearquivo de configurações para o usuário como uma etapa antes de enviar o e-mail em seu script.

Mude seu script para este:

#!/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

cronnão sabe nada sobre o seu shell - ele é iniciado pelo sistema, portanto possui um ambiente mínimo. Se você quiser que ele encontre seus programas ou execute utilitários instalados em seu sistema, você deve primeiro informar onde eles estão, e você pode fazer isso definindo as .profilevariáveis ​​​​no início do seu script.

Alguns links úteis:

Responder3

Vi que você obteve algumas respostas, mas não uma resposta clara e funcional. O que funcionou para mim foi definir o cron desta forma:

*/5 * * * * /fullpath/cron.sh | ( body="$(cat)"; if [[ -n $body ]]; then echo "$body" | mail -s "Saída do script Cron"[e-mail protegido]; fi)

isso captura a saída e a envia para o e-mail, sem que eu receba um e-mail vazio, mesmo quando estou executando um script. (graças a Colucix)

informação relacionada