Я использую планировщик с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
Что не есть информативно. Куда лучше было бы получать письма, в теме которых было что-то красивое и удобное. Однако для этого одним только 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.
0 коммент.:
Отправить комментарий