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