Chcę wiedzieć, jak dokładnie zobaczyć, co robią zadania cron przy każdym wykonaniu. Gdzie znajdują się pliki dziennika? Czy mogę wysłać dane wyjściowe na mój e-mail? Ustawiłem adres e-mail, aby wysłać dziennik po uruchomieniu zadania cron, ale nic jeszcze nie otrzymałem.
218
Odpowiedzi:
zaloguje wszystkie dane wyjściowe z zadania cron do /var/log/myjob.log
Możesz użyć
mail
do wysyłania e-maili. Większość systemów wysyła nieobsługiwanecron
dane wyjściowe zadania pocztą e-mail do użytkownika root lub odpowiedniego użytkownika.źródło
2>&1
: stackoverflow.com/questions/818255/in-the-bash-shell-what-is-21stderr
i drugiestdout
w dzienniku,2>&1
musi przyjść po pośrednictwie:myjob.sh >> /var/log/myjob.log 2>&1
YYYY-MM-DD_hh-mm-sec
do nazwy pliku wyjściowego, aby każda nazwa pliku była inna i przechowywana bez przepisywania?date +\%Y\%m\%d\%H\%M\%S
-cron.log 2> & 1Domyślnie cron loguje się do / var / log / syslog, dzięki czemu możesz zobaczyć wpisy związane z cron, używając:
/ubuntu/56683/where-is-the-cron-crontab-log
źródło
journalctl | grep cron
na systemach systemowych/var/log/cron
na AWS Linux AMI.sudo journalctl -u cron
cron
jest rejestrowane, jest bardzo zależne od systemu. Istnieje osobna odpowiedź ze szczegółowymi informacjami na temat konfiguracji różnych miejsc docelowych rejestrowania w systemach Linux (a dokładniej w systemach, które używająsyslog
). Inne systemy mogą mieć inny sposób konfiguracji tych rzeczy.Oto mój kod:
źródło
>>
dołącza i2>&1
mówi, aby wysłać standardowy błąd w to samo miejsce, co standardowe wyjście.Istnieją co najmniej trzy różne typy rejestrowania:
Rejestrowanie PRZED uruchomieniem programu, które loguje się tylko JEŚLI współdziałanie PRÓBUJE wykonać polecenie. Ten znajduje się w / var / log / syslog, jak już wspomniano w @Matthew Lock.
Rejestrowanie błędów PO próbie uruchomienia programu, którą można wysłać na adres e-mail lub do pliku, jak wspomniano w @Spliffster. Wolę logować się do pliku, ponieważ z pocztą e-mail masz nowe źródło problemów i sprawdzanie, czy wysyłanie i odbieranie wiadomości e-mail działa idealnie. Czasami tak jest, czasem nie. Na przykład na zwykłym komputerze stacjonarnym, na którym nie chcesz konfigurować smtp, czasem wolisz zalogować się do pliku:
Istnieje kilka typowych źródeł problemów z cronjobs: * ABSOLUTNA ŚCIEŻKA pliku binarnego do wykonania. Kiedy uruchomisz go ze swojej powłoki, może działać, ale proces cron wydaje się korzystać z innego środowiska, a zatem nie zawsze znajdzie pliki binarne, jeśli nie użyjesz ścieżki bezwzględnej. * BIBLIOTEKI używane przez plik binarny. Jest to mniej więcej ten sam poprzedni punkt, ale upewnij się, że po prostu wstawiając NAZWĘ polecenia, odnosi się on dokładnie do pliku binarnego, który korzysta z tej samej biblioteki, lub lepiej, sprawdź, czy plik binarny, do którego się odwołujesz, zawiera ścieżkę bezwzględną to to samo, co polecasz, kiedy bezpośrednio używasz konsoli. Pliki binarne można znaleźć za pomocą polecenia locate, na przykład:
Upewnij się, że plik binarny, do którego będziesz się odwoływać, jest tym samym plikiem binarnym, który wywołujesz w swojej powłoce, lub po prostu ponownie przetestuj w swojej powłoce, używając absolutnej ścieżki, którą planujesz umieścić w cronjob.
źródło
W Ubuntu możesz włączyć
cron.log
plik zawierający tylko wpisy CRON.Odkomentuj wiersz, który wspomina
cron
w/etc/rsyslog.d/50-default.conf
pliku:Zapisz i zamknij plik, a następnie uruchom ponownie
rsyslog
usługę:Teraz możesz zobaczyć wpisy dziennika cron we własnym pliku:
Przykładowe wyniki:
Jednak nie zobaczysz więcej informacji na temat tego, które skrypty zostały faktycznie uruchomione w środku
/etc/cron.daily
lub/etc/cron.hourly
, chyba że skrypty te kierują dane wyjściowe do pliku cron.log (lub może do innego pliku dziennika).Jeśli chcesz sprawdzić, czy plik crontab jest uruchomiony i nie musisz go wyszukiwać w
cron.log
lubsyslog
, utwórz plik crontab, który przekierowuje dane wyjściowe do wybranego pliku dziennika - coś takiego:Kroki zaczerpnięte z: https://www.cyberciti.biz/faq/howto-create-cron-log-file-to-log-crontab-logs-in-ubuntu-linux/
źródło
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
wcrontab
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
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
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 Perluwarn
idie
wypisz na standardowy błąd; w Pythonie piszsys.stderr
lub używajlogging
; 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.źródło
Jeśli korzystasz z polecenia sudo, to na to nie pozwoli. Sudo potrzebuje tty.
źródło
sudo
konfiguracji. Rzeczy, które muszą działać bez możliwości podania hasła, należy skonfigurowaćNOPASSWD:
wsudoers
konfiguracji.Po określeniu prawidłowego adresu e-mail otrzymasz wynik wykonanego zadania cron. W ten sposób będziesz mógł to sprawdzić i upewnić się, że wszystko zostało wykonane poprawnie. Pamiętaj, że nie otrzymasz wiadomości e-mail, jeśli nie ma danych wyjściowych z polecenia zadania cron.
Pamiętaj, że otrzymasz wiadomość e-mail dla każdego z wykonanych zadań cron. Może to spowodować zalanie skrzynki odbiorczej w przypadku zbyt częstego uruchamiania twoich cronów
źródło