!/bin/sh -xv

!/bin/sh -xv

Estoy usando centos 7.0/6.5. El contenido 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

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

myhost Mon Jul 28 11:01:01 CST 2014

Pero recibí un correo electrónico vacío, con el asunto correcto. Entonces, pruebo este cron manualmente. Recibí el contenido correcto del correo electrónico.

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

Aquí está el registro 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

Me pregunto cómo solucionar este problema.

Respuesta1

Algunas cosas para probar.

  1. !/bin/sh -xv

  2. Intente redirigir stderr con dos signos mayores que, 2>>&1.

El primero le dará el resultado paso a paso de su script. Lo intentaría primero sin redirigir stderr a su archivo de registro. Cron debería enviarle por correo una copia del resultado. Puedes ver exactamente dónde sale mal.

El segundo. ¿Quizás tienes un error que está afectando tu salida estándar? (Probablemente no, funciona como lo tienes en CentOS 6.5).

También puedes buscar caracteres no imprimibles usando cat.

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

Otra cosa que puedes intentar es usar rutas absolutas a tus comandos, /bin/echo en lugar de echo, /bin/date en lugar de date, /bin/hostname en lugar de hostname. (ymmv) Jim tiene toda la razón en que cron no siempre usa el entorno exacto como el mismo usuario interactivo.

Respuesta2

Está seguro de que el crontrabajo funciona, según sus comentarios; sin embargo, lo ha probado ejecutando el trabajo manualmente mientras está conectado. La cuestión es que los trabajos ejecutados cronno tienen en cuenta la configuración y las variables de entorno que tiene con su usuario actual, por lo que probablemente necesite obtener el .bash_profilearchivo de configuración para el usuario como paso antes de enviar el correo electrónico en su secuencia de comandos.

Cambie su script a esto:

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

cronno sabe nada acerca de su shell: lo inicia el sistema, por lo que tiene un entorno mínimo. Si desea que pueda encontrar sus programas o ejecutar utilidades instaladas en su sistema, debe informarle dónde están en primer lugar, y puede hacerlo configurando las .profilevariables al comienzo de su secuencia de comandos.

Algunos enlaces útiles:

Respuesta3

Vi que obtuviste algunas respuestas pero no una respuesta clara y funcional. Lo que funcionó para mí fue configurar el cron de esta manera:

*/5 * * * * /fullpath/cron.sh | ( body="$(cat)"; if [[ -n $body ]]; luego echo "$body" | mail -s "Salida del script cron"[correo electrónico protegido]; fi)

esto captura el resultado y lo envía por correo sin que reciba un correo electrónico vacío incluso cuando se ejecuta en un script. (gracias a colucix)

información relacionada