Jak mogę odbierać wiadomości e-mail od crona tylko w przypadku wystąpienia błędów?
W przeważającej większości przypadków zadania będą działać dobrze - i naprawdę nie dbam o wynik.
Tylko w rzadkim przypadku awarii chcę / muszę wiedzieć.
Mam dostępny procmail - ale nie jestem pewien, czy to, co opisuję, jest możliwe do zarządzania zewnętrznie, aby cron „poprawnie”.
cron
email
error-handling
królikarnia
źródło
źródło
Odpowiedzi:
Ponieważ nie zależy ci na wynikach, możesz przekierować STDOUT zadania do
/dev/null
i pozwolić, aby STDERR był wysyłany pocztą (przy użyciuMAILTO
zmiennej środowiskowej).Na przykład:
wyśle pocztę, gdy jest ona wysyłana tylko na STDERR (z STDERR), i odrzuci STDOUT.
To oczywiście zakłada, że gdy program napisał na STDERR, nie powiódł się; nie zawsze tak jest. Jeśli masz kontrolę nad programem, możesz to zrobić. W każdym skomplikowanym przypadku powinieneś napisać jakieś opakowanie, które uruchamia polecenia (polecenia) i odpowiednio wysłać pocztę. I umieść opakowanie jako
cron
zadanie.źródło
chronic
Polecenie od moreutils wykonuje polecenie cicho, chyba że się nie powiedzie.Cytując z podręcznika:
źródło
Możesz owinąć swoje wywołania cron za pomocą cronic , skryptu powłoki, który zjada dane wyjściowe crona, chyba że kod powrotu wywoływanego procesu jest różny od zera lub nie wystąpił błąd śledzenia.
Aby użyć cronic, pobierz skrypt w odpowiednie miejsce, np
/usr/local/bin
. Wpisy w crontab muszą być poprzedzone ścieżką do skryptu (np./usr/local/bin/cronic
) Lub po prostucronic
, pod warunkiem, że twójPATH
jest poprawnie ustawiony.Pamiętaj, że „błędy” są źle zdefiniowanym terminem w twoim pytaniu i wymagają dokładnej definicji. Aby funkcja cronic była przydatna, musisz upewnić się, że zadania, które zawijasz z funkcją cronic, zgłaszają błędy w jeden ze sposobów, w jaki definiuje warunek błędu. Domniemane metody raportowania, takie jak zapisywanie ciągów tekstowych
STDOUT
, będą wymagały dalszych przemyśleń, aby uczynić to kompatybilnym z cronic lub innym mechanizmem raportowania cron.Dostępne są inne opakowania, do których linki znajdują się na stronie chronicznej:
źródło
cronic
związanechronic
, czy to tylko przypadek?cronic
jest zaimplementowany w bash,chronic
jak sugerowano we wcześniejszej odpowiedzi, jest skrypt Perla.Oto kolejna odmiana, którą z powodzeniem stosuję od wielu lat - przechwytuj dane wyjściowe i drukuj je tylko w przypadku błędu . Nie wymaga to plików tymczasowych i zachowuje wszystkie dane wyjściowe . Ważną częścią jest to,
2>&1
że przekierowuje STDERR do STDOUT.Wyślij całe wyjście za pomocą domyślnej konfiguracji cron mailera:
To samo, ale z określonym adresem i tematem:
Możesz nawet wykonać wiele działań w przypadku błędu i dodać do wiadomości e-mail:
Działa to w przypadku prostych poleceń. Jeśli masz do czynienia ze złożonymi potokami (
find / -type f | grep -v bla | tar something-or-other
), lepiej jest przenieść komendę do skryptu i uruchomić skrypt przy użyciu powyższego podejścia. Powodem jest to, że jeśli jakakolwiek część potoku wysyła do STDERR, nadal będziesz otrzymywać e-maile.źródło
$OUTPUT
w cudzysłowie:"$OUTPUT"
.Prawdopodobnie nie myślałem o tym przez cały czas, ale
w zwykłych przypadkach przekierowałby wszystko do pliku tymczasowego (prawdopodobnie chciałbyś użyć go w
mktemp
celu uzyskania unikalnej nazwy pliku), usunąłby to, jeśli plik się powiódł, a następniecat
zawartość ponownie, jeśli nadal istnieją (tzn. twoja.html została zakończona z warunkiem błędu), do odebrania przez program pocztowy cron.Jeśli pamięć służy, cron już nic nie wysyła, jeśli nie ma danych wyjściowych, więc jeśli plik dziennika jest pusty lub nie istnieje, nic się nie dzieje. (Przekierowujemy komunikat o błędzie.)
źródło