1

Я использую 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 ответа3

2

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

  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 и не всегда использует ту же среду, что и тот же интерактивный пользователь.

1

Вы уверены, что задание 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 в начале вашего скрипта. ,

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

0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .