Rejestrowanie WSZYSTKICH danych wyjściowych crontab do pliku

12

Na przykład mogę zalogować stderrjeden skrypt w następujący sposób:

* * * * * run_script.sh > /var/log.txt 2>&1

Ale chcę rejestrować stderrwszystkie skrypty w moim crontabie. Mogę dołączyć > /var/log.txt 2>&1do wszystkich skryptów, ale nie jest dobrze, jeśli mam setki skryptów cron. Czy istnieje inny, prostszy sposób to zrobić?

Masłow Anton
źródło

Odpowiedzi:

6

W crontab możesz ustawić MAILTO, aby wskazywał alias poczty, który uruchamia skrypt. Ten skrypt przyjmie wiadomość e-mail, usunie nagłówki i inne pliki goop, a resztę zarejestruje za pomocą programu rejestrującego. Ponieważ wszystkie dane wyjściowe skryptu cron są wysyłane na adres podany przez MAILTO, wszystko zostanie przechwycone.

Przykład: w crontab

MAILTO=myalias

W / etc / mail / aliases (zakładając, że używasz sendmaila)

myalias:"|/usr/local/bin/my-processing-script.sh"

i niech skrypt usunie nagłówki wiadomości i przetworzy dane wyjściowe crona.

Kyle Jones
źródło
czy możesz bardziej szczegółowo określić MAILTO, alias, MTA, skrypt itp.?
endolith
1
@endolith Zredagowałem odpowiedź, aby podać podstawową konfigurację, która powinna działać dla sendmaila i ogólnie kompatybilnych MTA. Musisz sam napisać skrypt.
Kyle Jones
5

Wszelkie dane wyjściowe wygenerowane przez polecenie są wysyłane do użytkownika określonego w zmiennej środowiskowej MAILTO zgodnie z ustawieniem w pliku crontab (5) lub, jeśli nie ustawiono żadnej zmiennej MAILTO (lub jeśli jest to zadanie at (1) lub wsadowe (1) ), do właściciela zadania. Jeśli polecenie nie generuje danych wyjściowych lub jeśli zmienna środowiskowa MAILTO jest ustawiona na pusty ciąg znaków, wiadomość nie zostanie wysłana.

Ponieważ używa lokalnej poczty, naprawdę nie musisz niczego konfigurować, a może po prostu zainstalować mailx, jeśli jeszcze go nie ma. Cron wyśle ​​ci wynik, możesz zapisać pocztę w pliku i stamtąd robić wiele rzeczy. Próba zmiany sposobu działania crona tak, aby bezpośrednio odpowiadała Twoim potrzebom, nie jest dobrym rozwiązaniem. Jeśli tak nie uważasz, po prostu załataj i ponownie zbuduj crona, nazwij go my_cron i użyj go zamiast crona. I bądź przygotowany na to, że w końcu będziesz aktualizować my_cron i często go odbudowywać.

Dodaj to na początku wszystkich skryptów, aby wszystko rejestrować i zatrzymać przy pierwszym błędzie

exec 2>&1 > /var/log/YOUR_LOG_FILE
set -e
Aki
źródło
czy kolejność przekierowań powinna być odwrotna? > /var/log/YOUR_LOG_FILE 2>&1tzn. najpierw przekieruj stdout do pliku, a dopiero potem przekieruj stderr do stdout (który teraz wskazuje na plik).
jfs
To dość szalone, że na minimalnym serwerze trzeba zainstalować usługę pocztową, a być może także klienta pocztowego, żeby tylko odczytać błędy generowane przez Crona. To wydaje się być anarchistyczną decyzją projektową.
James McMahon
0

Skrypt Ryana Ye pod adresem /programming//a/7145618/20774 jest również przydatny w tym przypadku, chociaż działa zarówno na standardowym, jak i standardowym.


Mam do tego mały skrypt cronlog.sh. Kod skryptu

#!/bin/sh
echo "[`date`] Start executing $1"
$@ 2>&1 | sed -e "s/\(.*\)/[`date`] \1/"
echo "[`date`] End executing $1"

Więc możesz to zrobić

cronlog.sh /opt/scripts/sql_fetch >> your_log_file

Przykładowy wynik

cronlog.sh echo 'hello world!'

[Mon Aug 22 04:46:03 CDT 2011] Start executing echo
[Mon Aug 22 04:46:03 CDT 2011] helloworld!
[Mon Aug 22 04:46:03 CDT 2011] End executing echo
James McMahon
źródło