Я использую 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
Несколько вещей, которые стоит попробовать.
!/bin/sh -xv
- Попробуйте перенаправить 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)