Wysyłaj tylko wiadomości e-mail o błędach cron dla zadań w cron.daily, cron.hourly itp

8

Mam kilka crona, które działają (w /etc/cron.daily, /etc/cron.hourly, /etc/cron.weekly, itd.) Oraz e-mail root@localhostz wynikami. Chciałbym zatrzymać te e-maile, jeśli zadania się powiodą, i tylko e-mail z błędem (rozumiem, że można to zrobić przez przekierowanie stdoutdo /dev/null). Rozumiem, jak to zrobić dla poszczególnych zadań cron, ale skrypty w tych specjalnych katalogach są uruchamiane przy użyciu run-parts. Jaki jest najlepszy sposób na powstrzymanie wiadomości e-mail o sukcesie dla tych skryptów?

jrdioko
źródło

Odpowiedzi:

5

Możesz użyć jednego z opakowań dla programów, które wypisują wszystko, gdy coś pójdzie nie tak i połkną standardowe wyjście.

Jednym z przykładów może być chroniczny , wystarczy dodać „chroniczny” do „części roboczych”, np .:

# m h dom mon dow user  command
 17 *  *   *   *  root  cd / && /etc/cronic run-parts --report /etc/cron.hourly

gdzie /etc/cronicjest miejsce z wykonywalnym skryptem chronicznym, pobranym ze wspomnianej strony internetowej.

Cyryl Płotnicki
źródło
5

Powinieneś wysłać pomyślne powiadomienia e-mail, aby /dev/nullzniknęły.

Ale chcesz zobaczyć nieudane powiadomienia e-mail.

Oznacza to, że musisz najpierw skierować stdoutdo, /dev/nulla następnie bezpośrednio /dev/stderrdostdout

spróbuj zmienić część przekierowującą twoich cronjobs na

>/dev/null 2>&1

Zobacz ten link

pavium
źródło
Czy nie powstrzymałoby to również wiadomości e-mail z błędami (ponieważ nie generowałyby żadnych danych wyjściowych)? Ponadto muszę to zrobić dla moich cron.XXXkatalogów, które używają run-parts, więc nie jest to tak proste, jak przekierowanie dla poszczególnych skryptów.
jrdioko
Nie chodzi o to, że stderrjest wyrzucany, a następnie stderr przekierowywany do stdout. Nie jestem pewien, co to run-partsjest, ale jednak działa przekierowanie, stdouta następnie stderrwydaje się być drogą.
pavium
Aha, przejrzałem Google run-parts. To komplikuje problem, prawda? Może powinieneś unikać run-partsi wywoływać każdy skrypt osobno.
pavium
Oh, ok, rozumiem. run-partsuruchamia wszystkie skrypty w katalogach takich jak /etc/cron.daily, więc sztuczka polega na przekierowaniu do poszczególnych uruchomionych skryptów.
jrdioko
2
Jesteś tego pewien >/dev/null 2>&1? Przetestowałem to i to wszystko prowadzi do tego /dev/null, że jeśli upuścisz, 2>&1jedyne stdout zostanie usunięte.
jrdioko
1
  • Jeśli skrypt zachowuje się dobrze, zapisze tylko w STDOUTprzypadku powodzenia i STDERRw przypadku wystąpienia błędu.
  • Domyślnie cron wyśle ​​wszystko, co skrypt zapisuje w STDOUT lub STDERR ( Arch wiki ).

Jeśli więc chcesz zachować powiadomienia o błędach, nie przekierowuj STDERR, po prostu STDOUT:

COMMAND > /dev/null

Jeśli robisz to typowo >/dev/null 2>&1, skutecznie eliminujesz oba ( dokumentacja bash ).

  1. Zrób stdindeskryptor pliku kopią / dev / null.
  2. Ustaw stderrdeskryptor pliku w kopię stdout(która już wskazywała na / dev / null).
morallo
źródło
Nawet jeśli nie odpowiada to w pełni na pierwotne pytanie, rozwiązuje niektóre błędy w odpowiedzi pawium .
morallo,