Показаны сообщения с ярлыком cron. Показать все сообщения
Показаны сообщения с ярлыком cron. Показать все сообщения

Cron и почта. Красивые и правильные отчёты о выполнении скриптов

среда, 11 ноября 2009 г.
Сегодня хочется поговорить о правильном оповещении себя любимого по почте о ходе выполнения скриптов в cron'е, т.к. на мой взгляд, самым главным в администрировании является молниеносная реакция на произошедшие события и ошибки.

Я использую планировщик сron в повседневно практике как средство резервного копирования, как средство мониторинга логов и выполнения других скриптов =). И в этом случаем для меня очень важен результат таких действий. Ведь может закончится место на диске, не правильно выставиться права на файлы после перезагрузки да и просто «коллеги» могу напакостить.
Сразу оговорю условия. Я буду рассматривать задачу с точки зрения шлюза в интернет, так как в этом случае наличие на нём установленного и настроенного почтовика стремится к нулю.
Так вот, cron по умолчанию отсылает результаты выполнения команд (проще говоря, то что должно выводится в консоль) на локальную почту пользователя. Пользы от такого довольно мало. Что бы поменять почту, на которую будут отсылаться письма, нужно определить переменную MAILTO в crontab'е:

$ crontab -e

MAILTO = user@ya.ru
# m h dom mon dow command
*/1 * * * * echo "123"; date

Однако, подождав, мы не получим ничего на нашу почту. Почта не ушла потому что у нас нет настроенного smtp сервера. И устанавливать такие монстры как sendmail, postfix и exim мы не будем. Зачем нам всё это на маленьком роутере, да и безопасности эти демоны ни капельки не добавят.

В этом случае лучшим решением, на мой взгляд, является msmtp. Маленькая программка, единственным назначением которой, является пересылка почты используя «большие» smtp сервера, к примеру gmail. Ставим:

$ sudo apt-get install msmtp

Конфигурируем на использование учётки на gmail:

$ nano ~/.msmtprc

defaults
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile ~/.msmtp.log

account gmail
host smtp.gmail.com
port 587
protocol smtp
auth on
from user@gmail.com
user user@gmail.com
password passWoRd

# Set a default account
account default : gmail

Не забываем права:

$ chmod 600 ~/.msmtprc

От этой учётки (той, которую указали в конфиге) мы будем получать письма.
Тепрь делаем финт ушами и создём симлинк на sendmail:

$ sudo ln -s /usr/bin/msmtp /usr/sbin/sendmail

Сейчас при выполнении команды из crontab'а к нам на почту (ту что мы указали в MAILTO) благополучно приходит почта с того адреса, который мы указали в конфиге msmtprc. =)
Ещё один маленький нюанс. Мы все помним, что есть три стандартных потока: stdin stdout и stderr. По умолчанию из крона отсылаются два потока: стандартный поток вывода и стандартный поток вывода ошибок. Для того чтобы мы получали только вывод ошибок на почту необходимо поменять строку в crontabe на следующую:

*/1 * * * * echo "123" > /dev/null

Так мы отправили весь стандартный вывод в «бездну».
И наоборот — чтобы получать только вывод скрипта и никаких ошибок:

*/1 * * * * echo "123" 2>/dev/null

Напомню, что 2 — это поток вывода ошибок.
Ну и напоследок, отправляем всё в небытие (не по теме, но может кому-то пригодится):

*/1 * * * * echo "123"> /dev/null 2>&1

Тут мы отправили стандартный вывод в /dev/null и тудаже вывод ошибок.
Вернёмся к почте. При такой отправке результатов к нам на почту приходят письма примерно с такой темой:

Cron echo "123" 2> /dev/null

Что не есть информативно. Куда лучше было бы получать письма, в теме которых было что-то красивое и удобное. Однако для этого одним только MAILTO из crontab'а не обойтись.
Здесь нам понадобится команда mail. Если у вас её нет, тогда поставим heirloom-mailx:

$ sudo apt-get install --no-install-recommends heirloom-mailx

Теперь нужно указать в конфиге mail, что мы будем использовать msmtp.

$ nano ~/.mailrc

set sendmail="/usr/bin/msmtp"

Проверяем отправку почты

$ mail -s "Здесь будет тема письма." user@ya.ru

Далее пишем текст письма и нажимаем Ctr-D (^D ;).
Ну и собственно кронтаб:

*/1 * * * * echo "123" | mail -s "Проверка крона" user@ya.ru

Или вот так, если логи/текст у нас уже сформированы и хранятся в файле super_logs.txt

*/1 * * * * mail -s "Проверка крона" user@ya.ru < super_logs.txt

Вместо вывода

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

cron & crontab

вторник, 3 февраля 2009 г.
Пример cron-файла
#minute hour mday month wday who command
*/5 * * * * root /usr/bin/who >> /var/log/who.log

Поле Допустимое значение
Минуты (minute) 0-59
Час (hour) 0-23
День месяца (dayofmonth) 1-31
Месяц (month) 1-12 или первые три буквы английского
названия месяца (регистр не учитывается)
День недели (dayofweek) 0-7 (где 0 и 7 это воскресенье) или первые
три буквы английского названия дня в неделе (регистр не учитывается)

Строка Что это значит

@reboot Запускать при начальной загрузке
@yearly Заменяет "0 0 1 1 *" т.е. «ежегодно в 00:00 1 января»
@annually Тоже что и yearly
@monthly Заменяет "0 0 1 * *" т.е. «ежемесячно в 00:00 1 числа»
@weekly Заменяет "0 0 * * 0" т.е. «еженедельно в 00:00 воскресенье»
@daily Заменяет "0 0 * * *" т.е. «ежедневно в 00:00»
@midnight Тоже что и daily
@hourly Заменяет "0 * * * *" т.е. «ежечасно в 00 минут»

crontab - создание пользовательских списков запланированных заданий

crontab -e редактирование пользовательского cron-файла
crontab -l просмотр пользовательского cron-файла
crontab -r удаление пользовательского cron-файла

root может управлять файлами пользователей
crontab -u user {-e | -l | -r }