Jak zalogować zadania CRON?


Odpowiedzi:


347
* * * * * myjob.sh >> /var/log/myjob.log 2>&1

zaloguje wszystkie dane wyjściowe z zadania cron do /var/log/myjob.log

Możesz użyć maildo wysyłania e-maili. Większość systemów wysyła nieobsługiwane crondane wyjściowe zadania pocztą e-mail do użytkownika root lub odpowiedniego użytkownika.



5
jaki może być problem, jeśli ten plik dziennika nigdy nie zostanie utworzony?
zacisk

10
FWIW, Jeśli chcesz mieć jedno stderri drugie stdoutw dzienniku, 2>&1musi przyjść po pośrednictwie:myjob.sh >> /var/log/myjob.log 2>&1
Dan Lecocq

2
Jak wstawić YYYY-MM-DD_hh-mm-secdo nazwy pliku wyjściowego, aby każda nazwa pliku była inna i przechowywana bez przepisywania?
Danijel

6
@Danijel serverfault.com/a/117365/193377 0 0 * * * /some/path/to/a/file.php> $ HOME / date +\%Y\%m\%d\%H\%M\%S-cron.log 2> & 1
AnneTheAgile 11.10.17

61

Domyślnie cron loguje się do / var / log / syslog, dzięki czemu możesz zobaczyć wpisy związane z cron, używając:

grep CRON /var/log/syslog

/ubuntu/56683/where-is-the-cron-crontab-log


2
W systemie Ubuntu 12.04 domyślnie nie ma
pliku

5
używać journalctl | grep cronna systemach systemowych
Microsoft Linux TM

2
/var/log/cronna AWS Linux AMI.
Jonathan

2
lubsudo journalctl -u cron
Gianfranco P.

2
To, gdzie dokładnie cronjest 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.
tripleee

10

Oto mój kod:

* * * * * your_script_fullpath >> your_log_path 2>&1

„>>” oznacza dołączyć dane do filtru? co oznacza „2> i 1”, pełne wyjście z błędem, prawda?
Nullpointer

3
Podstawowe pytania dotyczące przekierowania najlepiej sprawdzić w instrukcji. Istnieje również metryka potrzebbie zduplikowanych pytań na temat tych operatorów tutaj na Stack Overflow. Ale tak, z grubsza; >>dołącza i 2>&1mówi, aby wysłać standardowy błąd w to samo miejsce, co standardowe wyjście.
tripleee

10

Istnieją co najmniej trzy różne typy rejestrowania:

  1. 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.

  2. 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:

     * * * *  COMMAND_ABSOLUTE_PATH > /ABSOLUTE_PATH_TO_LOG 2>&1
    
    • Rozważę również sprawdzenie uprawnień / ABSOLUTE_PATH_TO_LOG i uruchomienie polecenia z uprawnień tego użytkownika. Tylko do weryfikacji, podczas testowania, czy może to być potencjalne źródło problemów.
  3. Logowanie samego programu, z własną obsługą błędów i rejestrowaniem do celów śledzenia.

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:

$locate python

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.

  • Innym częstym źródłem problemów jest składnia w cronjob. Pamiętaj, że istnieją znaki specjalne, których można używać do list (przecinków), do definiowania zakresów (myślniki -), do określania przyrostu zakresów (ukośniki) itp. Spójrz: http://www.softpanorama.org/Utilities/ cron.shtml

8

W Ubuntu możesz włączyć cron.logplik zawierający tylko wpisy CRON.

Odkomentuj wiersz, który wspomina cronw /etc/rsyslog.d/50-default.confpliku:

#  Default rules for rsyslog.
#

#                       For more information see rsyslog.conf(5) and /etc/rsyslog.conf

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                          /var/log/cron.log

Zapisz i zamknij plik, a następnie uruchom ponownie rsyslogusługę:

sudo systemctl restart rsyslog

Teraz możesz zobaczyć wpisy dziennika cron we własnym pliku:

sudo tail -f /var/log/cron.log

Przykładowe wyniki:

Jul 18 07:05:01 machine-host-name CRON[13638]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)

Jednak nie zobaczysz więcej informacji na temat tego, które skrypty zostały faktycznie uruchomione w środku /etc/cron.dailylub /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.loglub syslog, utwórz plik crontab, który przekierowuje dane wyjściowe do wybranego pliku dziennika - coś takiego:

# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log 2>&1

Kroki zaczerpnięte z: https://www.cyberciti.biz/faq/howto-create-cron-log-file-to-log-crontab-logs-in-ubuntu-linux/


Ubuntu 16.04 nie wyświetlał żadnego dziennika cron i ta informacja załatwiła sprawę.
pojda

5

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=recipientw crontabpliku 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>&1na „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.)

cronzadania 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/stderrdo komunikatów o błędach, ale nie jest to odpowiednio przenośne; w Perlu warni diewypisz na standardowy błąd; w Pythonie pisz sys.stderrlub 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.


1

Jeśli korzystasz z polecenia sudo, to na to nie pozwoli. Sudo potrzebuje tty.


4
Zależy to również od sudokonfiguracji. Rzeczy, które muszą działać bez możliwości podania hasła, należy skonfigurować NOPASSWD:w sudoerskonfiguracji.
tripleee

0

Jeśli nadal chcesz sprawdzić swoje zadania cron, powinieneś podać prawidłowe konto e-mail podczas ustawiania zadań Cron w cPanel.

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.