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

45

Я создаю задания cron в 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 , я отправляю почту с моего Google-аккаунта. Тот факт, что SSMTP может отправлять почту только с использованием одной учетной записи, для меня не проблема. Это просто домашний сервер, и у меня нет пользователей, которые могут добавлять задания cron.

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

Исключен
источник

Ответы:

60

По умолчанию 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
Филип Рейнольдс
источник
Разве /etc/aliasesзаписи не должны соответствовать формату name: value1, value2, ... ? Я не знаю, может быть, формат был изменен в какой-то момент за последние 8 лет.
Натан Джонс
1
«для меня я бы использовал псевдоним« root »для« phil »(моя учетная запись пользователя) и псевдоним« phil »для моего внешнего адреса электронной почты». Как псевдоним "Фил" на внешний адрес электронной почты?
Говард Ли
29

Чтобы получать электронную почту, отправленную с 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 на ноль. Если какие-либо сообщения STDERR присутствуют, они получат электронное письмо к вам.

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

Theozaurus
источник
3
Могли бы попробовать habilis.net/cronic
dfrankow
8

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

MAILTO="address@example.com"
Дэн Карли
источник
5

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

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

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

Даниэль П
источник
3

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

Низкий Киан Сон
источник
2

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

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

Дэвид Макинтош
источник
ssmtp реализует / bin / sendmail
bobpaul
2

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

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

#!/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

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

irdroid3
источник