пятница, 1 февраля 2008 г.

cron, MAILTO и exim. Получаем результат выполнения команд по электронной почте

cron имеет простую и замечательную возможность направлять вывод выполняемых команд на почту. Вот сижу я, работаю, а cron занимается своими делами: обновляет библиотеки из svn, делает резервные копии баз данных, отсылает уведомление моим друзьям, чтоб они не забыли поздравить меня с Днем рождения... И все это происходит тихо и неслышно. Иногда просто забываешь о том, что у тебя бэкапится база данных, которая уже сто лет как переименована, а потому уже вовсе и не бэкапится. Еще хуже, если во время рассылки уведомления о ДР произошел тотальный и фатальный сбой. И тогда ты сидишь один, с тортом из крема и энного количества свечек, и недоумеваешь: почему же так вышло??? А вышло так потому, что вывод команды, содержащий в себе уведомление об ошибке, в лучшем случае остался только в логах, прочитать которые приходит мысль только после того, как День рождения был безвозвратно испорчен :-)

Итак, настраиваем отправку вывода команд на свой почтовый ящик!

Берем cron. Лучше его, конечно же, брать за crontab. Поэтому мы набираем в консоли:

$ crontab -e

Далее вверху файла добавляем такую строчку:

MAILTO = email@inter.net

Понятно, что адрес мы заменяем на свой собственный. Потому как лично мне ваши отчеты о выполненных кроном задачах почему-то совершенно не интересны. Для того, чтобы убедиться, что все работает, добавляем тестовую ежеминутную задачу для крона:

* * * * * echo 'Вот и наступило долгожданное время: ' ; date

Сохраняем файл, засекаем время (пару минут хватит), выкуриваем сигарету/чупа-чупс/печенюшку, целуем жену/ребенка/начальника и возвращаемся к любимому и ненавистному компьютеру, дабы проверить электронную почту.

Но... Писем нет! Если Вы продолжили читать, то, наверное, таки нет :-) Вероятно, причина в том, что наш sendmail любезно отправил письмо в папку /var/mail. Толку от такого письма не намного больше, чем от лог-файла. Что же делать? Настраивать систему пересылки писем.

В моем Debian Lenny (testing) утилиту sendmail заменяет exim4. Если у вас та же ситуация, то его, родимого, мы и будем настраивать. Но, для начала, давайте все-таки убедимся. Набираем в консоли:

$ stat /usr/sbin/sendmail

Если в первой строчке вывода команды вы видите следующее:

File: `/usr/sbin/sendmail' -> `exim4'

то приступаем к настройке exim.

Загвоздка вся в том, что exim у нас настроен так, что работает только с локальным хостом, и во внешний мир не суется. Нам же нужно отправлять письма на внешний адрес. В конфиги сегодня лезть не будем - упростим себе жизнь. Набираем в консоли:

$ sudo dpkg-reconfigure exim4-config

И поэтапно отвечаем на вопросы.

- На странице "Общий тип почтовой конфигурации" выбираем "интернет-сайт; прием и отправка почты напрямую, используя SMTP".
- Далее вводим "Почтовое имя" - введите имя свое компьютера.
- В поле "IP-адреса, с которых следует ожидать входящие соединения SMTP", вводим свой локальный адрес: 127.0.0.1. Если только вы не собираетесь организовывать публичный почтовый сервер. И ни в коем случае не оставляйте поле пустым. А то мало ли кто к вашему серверу подключится и что Вам пришлет ;-)
- В качестве имени домена назначения опять же введите название своей машины.
- Если у вас модемное подключение к интернету, то согласитесь с сокращением DNS-запросов до минимума.

Остальные поля оставляем незаполненные или выбранные по умолчанию.

Закончили настройку exim. Засекаем время (пару минут хватит), выкуриваем сигарету/чупа-чупс/печенюшку, целуем жену/ребенка/начальника и возвращаемся к любимому и ненавистному компьютеру, дабы проверить электронную почту. Пришла - поздравляю! Не пришла - примите мои соболезнования, а лучше напишите мне и попробуем разобраться вместе ;-) Кроме того, можно найти полезную информацию в статье о настройке различных MTA для отправки через внешний SMTP.

8 комментариев:

  1. Спасибо за пост
    изначально все работало, но при попытке добавить скрипт - перестало отправляться даже тестовые сообщения, поможете? Может быть можно что нить почитать кроме манов?

    ОтветитьУдалить
  2. Давайте попробуем разобраться. Не могли бы Вы показать ваш файл заданий? Обратите внимания, чтобы в нем случайно не образовались лишние переносы строк.

    Что касается литературы - я не стал бы советовать читать что-то еще. Конечно, когда нужен быстрый ответ на простой вопрос, Google несомненно рулит. Но если нужно разобраться более детально, то лучше обращаться к первоисточникам - т.е. к мануалам. В крайнем случае, если есть какие-то трудности с английским, можно поискать переводы мануалов.

    ОтветитьУдалить
  3. Такое ощущение, что во время перерыва сигарета отбирается у жены, чупа-чупс - у ребенка, а печенюшка - у начальника, за что им потом и раздаются поцелуи :). Ну это лирическое отступление, а вообще у меня замечание. Изначально cron не подозревает о существовании $PATH и я бы рекомендовал для общего случая указывать абсолютные пути, то есть в данном случае echo заменить на /bin/echo, а date - соответственно на /bin/date.

    ОтветитьУдалить
  4. Здравствуйте - по крону письмо пришло 1 раз - и все, но через ls | mail -s "Вывод команды" pupkin@mail.ru никак нехочет отправлять - команда проходит, но письмо неприходит.

    ОтветитьУдалить
  5. http://debback.blogspot.com/2008/03/blog-post.html

    В обсуждении этой статьи Mak_s обратил внимание, что большинство серверов будут нещадно резать попытку отправить мыло с локалхоста. Я с такой проблемой не сталкивался, вероятно, потому что шлю на корпоративный почтовый сервер. Как побороть эту проблему - мне самому интересно было бы узнать. Может где-то в настройках exim можно указать, через какой smtp сервер нужно отсылать письма.

    Если удастся решить проблему, прошу поделиться методом :-)

    ОтветитьУдалить
  6. Попробовал отправить себе на gmail - дошло, как ни странно. А Вы пробовали заглядывать в лог экзима?

    /var/log/exim4/mainlog

    ОтветитьУдалить
  7. А не подскажите, нужно что бы почта не присылалась. Типа MAILTO="".

    ОтветитьУдалить
  8. Все зависит от того, кем и зачем она посылается.

    ОтветитьУдалить