cron
już wysyła standardowe wyjście i standardowy błąd każdego zadania, które uruchamia pocztą, do właściciela zadania cron.
Można użyć MAILTO=recipient
w crontab
pliku mieć wiadomości przesłane do innego konta.
Aby to zadziałało, musisz mieć poprawnie działającą pocztę. Dostarczenie do lokalnej skrzynki pocztowej zwykle nie stanowi problemu (w rzeczywistości są szanse ls -l "$MAIL"
, że dostaniesz już trochę), ale wyjęcie go z pudełka i wysłanie do Internetu wymaga MTA (Postfix, Sendmail, co masz), aby być odpowiednio skonfigurowany, aby połączyć się ze światem.
Jeśli nie ma danych wyjściowych, wiadomość e-mail nie zostanie wygenerowana.
Powszechnym rozwiązaniem jest przekierowanie danych wyjściowych do pliku, w którym to przypadku demon cron nie zobaczy zadania zwracającego dane wyjściowe. Wariantem jest przekierowanie standardowego wyjścia do pliku (lub napisanie skryptu, aby nigdy niczego nie drukował - być może przechowuje wyniki w bazie danych lub wykonuje zadania konserwacyjne, które po prostu niczego nie generują?) I otrzymuje wiadomość e-mail, jeśli istnieje to komunikat o błędzie.
Aby przekierować oba strumienie wyjściowe, składnia jest następująca
42 17 * * * script >>stdout.log 2>>stderr.log
Zauważ, jak dodajemy (podwójnie >>
) zamiast nadpisywać, aby wyniki poprzednich zadań nie były zastępowane wynikami następnego zadania.
Jak sugerowano w wielu odpowiedziach tutaj, oba strumienie wyjściowe można wysłać do jednego pliku; zamień drugie przekierowanie 2>&1
na „standardowy błąd powinien iść wszędzie tam, gdzie idzie standardowe wyjście”. (Ale szczególnie nie popieram tej praktyki. Ma to sens przede wszystkim, jeśli tak naprawdę nie oczekujesz niczego na standardowym wyjściu, ale możesz coś przeoczyć, być może pochodzące z zewnętrznego narzędzia, które jest wywoływane ze skryptu.)
cron
zadania działają w twoim katalogu domowym, więc wszelkie względne nazwy plików powinny być do tego względne. Jeśli chcesz pisać poza katalogiem macierzystym, oczywiście musisz osobno upewnić się, że masz dostęp do zapisu do tego pliku docelowego.
Powszechnym antipatternem jest przekierowywanie wszystkiego na /dev/null
(a następnie poprosić Stack Overflow, aby pomógł ci dowiedzieć się, co poszło nie tak, gdy coś nie działa; ale nie widzimy też utraconego wyniku!)
Z poziomu skryptu upewnij się, że oddzielne są regularne dane wyjściowe (rzeczywiste wyniki, najlepiej w formie do odczytu maszynowego) i diagnostyka (zwykle sformatowana dla czytelnika). W skrypcie powłoki
echo "$results" # regular results go to stdout
echo "$0: something went wrong" >&2
Niektóre platformy (i np. GNU Awk) pozwalają na używanie nazwy pliku /dev/stderr
do komunikatów o błędach, ale nie jest to odpowiednio przenośne; w Perlu warn
i die
wypisz na standardowy błąd; w Pythonie pisz sys.stderr
lub używaj logging
; w Ruby spróbuj $stderr.puts
. Zwróć także uwagę, w jaki sposób komunikaty o błędach powinny zawierać nazwę skryptu, który wygenerował komunikat diagnostyczny.