Таблица cron mailx вызвала пустой контент

Я использую 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" me@example.com < $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

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

3 ответа

Решение

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

  1. ! / bin / sh -xv

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

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

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

Вы также можете проверить наличие непечатных символов, используя cat.

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

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

Вы уверены, что 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" me@example.com < $log

cron ничего не знает о вашей оболочке - она ​​запускается системой, поэтому имеет минимальное окружение. Если вы хотите, чтобы он мог найти ваши программы или запустить утилиты, установленные в вашей системе, вы должны сообщить ему, где они находятся, и вы можете сделать это, установив .profile переменные в начале вашего скрипта.

Несколько полезных ссылок:

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

* / 5 * * * * /fullpath/cron.sh | (body = "$ (cat)"; if [[-n $ body]]; затем повторить "$body" | mail -s "Вывод скрипта Cron" me@example.com; fi)

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

Другие вопросы по тегам