Jak zdobyć wiadomość e-mail z (nieudanych) zadań cron w Ubuntu?

45

Tworzę zadania cron w Ubuntu, umieszczając plik wykonywalny w jednym z nich /etc/cron.{daily,hourly,monthly,weekly}. Istnieje wiele katalogów zaczynających się od crona:

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

Chcę otrzymywać wiadomości e-mail ze swoich skryptów, gdy:

  1. Skrypt kończy się niepowodzeniem i podaje kod wyjściowy niezerowy.
  2. Skrypt ma mi coś do powiedzenia

Mam zainstalowany i działający SSMTP , wysyłam pocztę z mojego konta Google. Fakt, że SSMTP może wysyłać pocztę tylko za pomocą jednego konta, nie stanowi dla mnie problemu. To tylko serwer domowy, a użytkownicy, których mam, nie mają możliwości dodawania zadań cron.

Chciałbym wiedzieć, jak mailing ze skryptów zwykle działa w systemie Linux / Unix w ogóle, a szczególnie w Ubuntu. Chciałbym również wiedzieć, w jaki sposób mogę uzyskać wiadomości e-mail w dwóch powyższych sytuacjach.

Usunięte
źródło

Odpowiedzi:

60

Domyślnie cron wyśle ​​wiadomość e-mail do właściciela konta, na którym działa crontab.

Ogólnosystemowy crontab znajduje się w / etc / crontab działa pod użytkownikiem root

Ponieważ root jest powszechnie używany, polecam dodanie aliasu root do twojego pliku / etc / aliases. (uruchom „newaliases” po)

Normalnym sposobem na ustrukturyzowanie tego jest rootowanie aliasu do innego użytkownika w systemie, np. Dla mnie alias „root” to „phil” (moje konto użytkownika) i alias „phil” na mój zewnętrzny adres e-mail.

Jeśli masz określonego crona użytkownika, którego chcesz wysłać pocztą e-mail, możesz ponownie użyć / etc / aliases (pod warunkiem, że masz dostęp administratora), aby przekierować użytkownika na inny adres e-mail, lub możesz użyć następującego adresu początek twojej tabeli:

MAILTO="[email protected]"

Jeśli poczta powinna zostać wysłana do lokalnego użytkownika, możesz zamiast tego podać tylko nazwę użytkownika:

MAILTO=someuser

Jeśli potrzebujesz więcej informacji, zobacz crontab (5), uruchamiając:

man 5 crontab
Philip Reynolds
źródło
Czy /etc/aliaseswpisy nie powinny być zgodne z tym formatem name: value1, value2, ... ? Nie wiem, może format został zmieniony w pewnym momencie w ciągu ostatnich 8 lat.
Nathan Jones
1
„dla mnie miałbym alias„ root ”na„ phil ”(moje konto użytkownika) i alias„ phil ”na mój zewnętrzny adres e-mail.” Jak alias „phil” na zewnętrzny adres e-mail?
Howard Lee,
29

Aby otrzymać e-mail wysłany z vixie cron, będziesz potrzebować czegoś, co replikuje polecenie sendmail. Więc zainstalowanie Postfiksa lub SSMTP rozwiąże tę część. Jeśli używasz Postfiksa, plik aliasów może być użyty do mapowania użytkowników systemu na prawdziwe adresy e-mail.

Dodanie MAILTO = „[email protected]” na górze tabeli crontab spowoduje wysłanie wiadomości e-mail z danymi wyjściowymi z zadania cron. Jest to niezależne od kodu błędu.

W przypadku skryptów, które poprawnie wyświetlają błędy w STDERR, łatwo jest wysłać je e-mailem tylko wtedy, gdy się nie udają:

MAILTO="[email protected]"
0 5 * * * /bin/some_script > /dev/null

Spowoduje to przekierowanie tylko STDOUT na zero. Jeśli jakieś wiadomości STDERR są obecne, otrzymają wiadomość e-mail.

Odkryłem jednak, że niektóre skrypty wyświetlają błędy niepoprawnie jako STDOUT i ustawiam kod wyjścia na 1. Nie znalazłem sposobu na pobranie z nich danych wyjściowych, ale ignoruję dane wyjściowe, jeśli kod wyjścia to 0. Jedyna metoda Mogę myśleć o przekierowaniu danych wyjściowych do pliku, a jeśli kod wyjścia nie jest równy 0, plik ten ma zostać pobrany przez crona. Wydaje się to dość okropne.

Theozaurus
źródło
3
Można spróbować habilis.net/cronic
dfrankow
8

Jeśli chcesz wysłać wszystkie dane wyjściowe (stdout i stderr) na określony adres, możesz użyć MAILTOzmiennej. Na przykład umieść następujące na górze skryptu.

MAILTO="[email protected]"
Dan Carley
źródło
5

spróbuj dodać „root: twó[email protected]” do / etc / aliases

który wyśle ​​wszystkie wiadomości tego użytkownika na Twój adres e-mail. jeśli nie chcesz wszystkich wiadomości, możesz utworzyć użytkownika specjalnie do tego.

Dopóki skrypt coś wypisze, dostaniesz wiadomość.

Daniel P.
źródło
3

Na wszystkich moich serwerach produkcyjnych, które zwykle uruchamiają około 20 cronjobs dziennie, przysięgam na pakiet python-cronwrap. Sprawdź to tutaj: http://pypi.python.org/pypi/cronwrap . Jest naprawdę łatwy w konfiguracji i przede wszystkim niezawodny.

Low Kian Seong
źródło
2

Nie sądzę, że SSMTP zależy od tego, czego potrzebujesz. Potrzebujesz czegoś, co może „odbierać” pocztę z procesów cron, a następnie wysyłać ją do prawdziwej skrzynki pocztowej.

Używam Sendmaila, ale to dlatego, że jestem starą ręką Słońca; Wiem, że śmieje się z tego wszystkich fajnych dzieciaków, które używają Postfix. Twoja społeczność ubuntu może poprowadzić Cię przez proces konfiguracji systemu pocztowego.

David Mackintosh
źródło
ssmtp implementuje / bin / sendmail
bobpaul
2

Alternatywa - archiwizuję całą pocztę główną do niektórych plików, a następnie usuwam oryginalną pocztę.

I cron skryptu (tutaj jest kluczowa część) -

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

Dzięki temu wszystko jest uporządkowane i mogę mieć to na oku. Mógłbym wysłać codzienny plik poczty e-mail na zewnętrzny identyfikator e-maila itp.

irdroid3
źródło