![!/bin/sh -xv](https://rvso.com/image/1417140/!%2Fbin%2Fsh%20-xv.png)
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.
!/bin/sh -xv
- 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 cron
trabalho 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 cron
nã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_profile
arquivo 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
cron
nã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 .profile
variá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)