Як отримати електронну пошту з (невдалої) роботи 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 може надсилати пошту лише за допомогою одного облікового запису, для мене не є проблемою. Це просто домашній сервер, і користувачі, які я маю, не мають можливості додавати крон-завдання.

Мені хотілося б знати, як зазвичай розсилка зі скриптів працює в Linux / Unix взагалі та конкретно в Ubuntu. Я також хотів би знати для мене хороший спосіб отримати пошту у двох вищевказаних ситуаціях.

Відповіді:


60

За замовчуванням, cron надішле електронну пошту власнику облікового запису, під яким працює crontab.

Загальносистемний crontab знаходиться в / etc / crontab працює під користувачем `root '

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

Нормальний спосіб структурування цього полягає в тому, щоб корінь був псевдонім іншому користувачеві в системі, наприклад, для мене я отримав би псевдонім "root" на "phil" (мій обліковий запис користувача) і псевдонім "phil" на мою зовнішню адресу електронної пошти.

Якщо у вас є певний користувацький крон, який ви хочете надіслати електронною поштою на виході, ви можете використовувати / etc / псевдоніми знову (за умови, що у вас є суперпользовательский доступ), щоб перенаправити користувача на іншу адресу електронної пошти, або ви можете використовувати наступну на у верхній частині вашого Crontab:

MAILTO="email@domain.com"

Якщо електронну пошту потрібно надіслати місцевому користувачеві, замість неї можна поставити лише ім’я користувача:

MAILTO=someuser

Якщо вам потрібна додаткова інформація, перегляньте crontab (5):

man 5 crontab

Чи не /etc/aliasesповинні записи відповідати формату name: value1, value2, ... ? Я не знаю, можливо, формат був змінений в якийсь момент за останні 8 років.
Натан Джонс

1
"для мене я отримав псевдонім" root "на" phil "(мій обліковий запис користувача) та псевдонім" 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. Здається, хоч і жахливо.


3
Можна спробувати habilis.net/cronic
dfrankow

8

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

MAILTO="address@example.com"

5

спробуйте додати "root: your@email.address" до / etc / псевдонімів

що надішле всі повідомлення для цього користувача на вашу електронну пошту. якщо ви не хочете всіх повідомлень, ви можете створити користувача спеціально для цього.

Поки сценарій щось виводить, ви отримаєте пошту.


3

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


2

Я не думаю, що SSMTP не залежить від того, що вам потрібно для цього. Вам потрібно щось, що може "отримувати" пошту від процесів кронів, а потім відправляти її на вашу справжню поштову скриньку.

Я використовую Sendmail, але це тому, що я стара рука Sun; Я знаю, що з цього дня всі смішні дітки насміхаються з тих, хто використовує Postfix. Ваша спільнота ubuntu може направляти вас у налаштуванні вашої поштової системи.


ssmtp Implements / bin / sendmail
bobpaul

2

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

Я крон сценарій (ось ключова частина) -

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

Це тримає речі в порядку, і я можу стежити за цим. Я можу надсилати щоденний файл пошти на зовнішній ідентифікатор електронної пошти тощо ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.