Назад | Перейти на главную страницу

Как получить электронную почту от (неудачных) заданий cron в Ubuntu?

Я создаю cron-job в Ubuntu, помещая исполняемый файл в один из /etc/cron.{daily,hourly,monthly,weekly}. Есть много каталогов, начинающихся с cron:

kent@rat:~$ ls -ld /etc/cron*
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.d
drwxr-xr-x 2 root root 4096 2009-07-16 13:17 /etc/cron.daily
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.hourly
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.monthly
-rw-r--r-- 1 root root  724 2009-05-16 23:49 /etc/crontab
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.weekly

Я хотел бы получать электронную почту из моих скриптов, когда:

  1. Сценарий завершается ошибкой и дает ненулевой код выхода.
  2. В сценарии есть что мне сказать

у меня есть SSMTP Установлен и работает, отправляю почту из своего гугл-аккаунта. Тот факт, что SSMTP может отправлять почту только с одной учетной записи, для меня не проблема. Это просто домашний сервер, и у моих пользователей нет возможности добавлять cron-job.

Хотелось бы узнать, как обычно работает рассылка из скриптов в Linux / Unix в целом и в Ubuntu в частности. Я также хотел бы знать, как мне получать почту в двух вышеупомянутых ситуациях.

По умолчанию cron отправляет электронное письмо владельцу учетной записи, под которой запущен crontab.

Общесистемный crontab находится в / etc / crontab запускается под пользователем `root '

Поскольку root широко используется, я бы порекомендовал добавить псевдоним root в ваш файл / etc / aliases. (запустите "newaliases" после)

Обычный способ структурировать это - использовать псевдоним root для другого пользователя в системе, например для меня я бы использовал псевдоним «root» для «phil» (моя учетная запись пользователя) и псевдоним «phil» для моего внешнего адреса электронной почты.

Если у вас есть конкретный пользовательский cron, который вы хотите отправить вам по электронной почте на выходе, вы можете снова использовать / etc / aliases (при условии, что у вас есть доступ суперпользователя), чтобы перенаправить пользователя на другой адрес электронной почты, или вы можете использовать следующее в верхняя часть вашего crontab:

MAILTO="email@domain.com"

Если почта должна быть отправлена ​​локальному пользователю, вы можете вместо этого указать только имя пользователя:

MAILTO=someuser

Если вам нужна дополнительная информация, см. Crontab (5), запустив:

man 5 crontab

Чтобы получать электронную почту от vixie cron, вам понадобится что-то, что копирует команду sendmail. Таким образом, установка postfix или SSMTP решит эту часть проблемы. Если вы используете postfix, то файл псевдонимов можно использовать для сопоставления пользователей системы с реальными адресами электронной почты.

Добавление MAILTO = "foo@bar.com" в начало crontab приведет к отправке по электронной почте любого вывода из задания cron. Это независимо от кода ошибки.

Для скриптов, которые правильно выводят ошибки в STDERR, их легко получить по электронной почте, только если они ошибаются, просто сделайте следующее:

MAILTO="foo@bar.com"
0 5 * * * /bin/some_script > /dev/null

Это перенаправит только STDOUT на null. Если присутствуют какие-либо сообщения STDERR, они получат вам электронное письмо.

Тем не менее, я обнаружил, что некоторые сценарии выводят ошибки неправильно как STDOUT и устанавливают код выхода равным 1. Я не нашел способа получить вывод из них, но игнорирую вывод, если код выхода равен 0. Единственный метод Я могу думать о перенаправлении вывода в файл, а затем, если код выхода не равен 0, выведите этот файл для захвата cron. Хотя это выглядит довольно ужасно.

Если вы хотите отправить весь вывод (stdout и stderr) на определенный адрес, вы можете использовать MAILTO переменная. Например, поместите следующее в верхней части скрипта.

MAILTO="address@example.com"

попробуйте добавить "root: your@email.address" в / etc / aliases

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

Пока сценарий что-то выводит, вы будете получать почту.

На всех моих производственных серверах, которые обычно запускают около 20 cronjobs в день, я использую пакет python-cronwrap. Посмотрите здесь: http://pypi.python.org/pypi/cronwrap. Его действительно легко настроить и, прежде всего, он надежен.

Я не думаю, что SSMTP подходит для того, что вам нужно. Вам нужно что-то, что может «получать» почту от процессов cron, а затем отправлять ее на ваш настоящий почтовый ящик.

Я использую Sendmail, но это потому, что я старый человек в Sun; Я знаю, что в наши дни над этим смеются все крутые ребята, использующие Postfix. Сообщество Ubuntu может помочь вам настроить вашу почтовую систему.

Альтернатива - я архивирую всю корневую почту в некоторые файлы, а затем удаляю исходную почту.

Я создаю скрипт (вот ключевая часть) -

#!/bin/bash
if `/usr/bin/mail -e`; then
   /usr/bin/mail --print 2>&1 > /tmp/email_${date +"%Y-%m-%d_%H.%M").log
   echo ‘d *’ | /usr/bin/mail -N > /dev/null
fi
exit 0

Так все будет в порядке, и я могу за этим следить. Я мог бы отправить по электронной почте ежедневный почтовый файл на внешний электронный адрес и т. Д.