!/bin/sh -xv

!/bin/sh -xv

Я использую centos 7.0/6.5. Содержимое /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

Результат /var/log/mail.cron.log

myhost Mon Jul 28 11:01:01 CST 2014

Но я получил пустое письмо с правильной темой. Поэтому я тестирую этот cron вручную. Я получил правильное содержание письма.

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

Вот соответствующий журнал/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

Мне интересно, как решить эту проблему.

решение1

Несколько вещей, которые стоит попробовать.

  1. !/bin/sh -xv

  2. Попробуйте перенаправить stderr с двумя знаками «больше», 2>>&1.

Первый даст вам пошаговый вывод вашего скрипта. Я бы попробовал сначала без перенаправления stderr в ваш файл журнала. Cron должен отправить вам копию вывода. Вы можете точно увидеть, где что-то идет не так.

Второе. Может быть, у вас ошибка, которая забивает ваш stdout? (Возможно, нет, у вас все работает так, как есть в CentOS 6.5.)

Вы также можете проверить наличие непечатаемых символов с помощью cat.

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

Еще одна вещь, которую стоит попробовать, — это использовать абсолютные пути к вашим командам, /bin/echo вместо echo, /bin/date вместо date, /bin/hostname вместо hostname. (ymmv) Джим абсолютно прав, говоря о том, что cron не всегда использует точную среду как один и тот же интерактивный пользователь.

решение2

Вы уверены, что cronзадание работает, как вы и сказали, однако вы проверили его вручную, запустив задание, когда вы вошли в систему. Дело в том, что задания, запущенные cronне учитывают настройки и переменные среды, которые у вас есть для текущего пользователя, поэтому вам, вероятно, нужно получить .bash_profileфайл настроек для пользователя в качестве шага перед отправкой письма в вашем скрипте.

Измените свой скрипт следующим образом:

#!/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ничего не знает о вашей оболочке - она ​​запускается системой, поэтому у нее минимальная среда. Если вы хотите, чтобы она могла находить ваши программы или запускать утилиты, установленные в вашей системе, вы должны сообщить ей, где они находятся в первую очередь, и вы можете сделать это, установив переменные .profileв начале вашего скрипта.

Некоторые полезные ссылки:

решение3

Я видел, что вы получили некоторые ответы, но не четкий рабочий ответ. Для меня сработало следующее:

*/5 * * * * /fullpath/cron.sh | ( body="$(cat)"; if [[ -n $body ]]; then echo "$body" | mail -s "Вывод скрипта Cron"[email protected]; фи)

это захватывает вывод и отправляет его на почту без него я получаю пустое письмо даже при запуске в скрипте. (спасибо colucix)

Связанный контент