Jak całkowicie wyciszyć cronjob do / dev / null /?


72

Na moim Ubuntu-Desktop i na moim serwerze debian mam skrypt, który musi być wykonywany co minutę (skrypt, który wywołuje minutnik mojej kosmicznej gry przeglądarkowej ).

Problem polega na tym, że na pochodnych Debiana cron loguje się przy /var/log/syslogkażdym uruchomieniu. W końcu widzę powtarzającą się wiadomość, która była wykonywana w kółko /var/log/syslog:

Nov 11 16:50:01 eclabs /USR/SBIN/CRON[31636]: (root) CMD (/usr/bin/w3m -no-cookie http://www.spacetrace.org/secret_script.php > /dev/null 2>&1)

Wiem, że aby ukryć wyjście programu, mogę go przekierować /dev/null, na przykład, aby ukryć wszystkie komunikaty o błędach i ostrzeżeniach przed programem, mogę utworzyć wiersz w crontabie w ten sposób

* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null

Ale chciałbym uruchomić cronjob i upewnić się, że wszystkie wygenerowane dane wyjściowe lub błędy są przesyłane do NULL, więc nie generuje żadnych wiadomości w syslog i nie generuje żadnych e-maili


EDYCJA:
istnieje rozwiązanie przekierowujące dzienniki cron do osobnego dziennika, jak zaproponowano tutaj poprzez zmianę/etc/syslog.conf

Ale wadą jest to, że WSZYSTKIE dane wyjściowe wszystkich cronjobs są przekierowywane.

Czy mogę w jakiś sposób przekierować tylko pojedynczą usługę Cronjob do osobnego pliku dziennika? Najlepiej konfigurowalny w samym cron.hourlypliku.


2
Możesz także po prostu umieścić MAILTO=""na początku pliku cron. Spowoduje to usunięcie wszystkich e-maili. I nigdy nie słyszałem o demonie cron, który wysyła dane wyjściowe zadania do syslog (ale wydaje mi się, że jest to możliwe).
Patrick,

@Patrick - spowoduje to wyłączenie wszystkiego, co może być OK, ale pamiętaj tylko. Zobacz moją aktualizację, możesz ustawić wiele mAILTO.
slm

Tak, MAILTO=""ponieważ pierwsza linia crontab zapobiegnie wysyłaniu wiadomości e-mail. Ponadto, jeśli blokujesz wszystkie dane wyjściowe, użyj pełnej trifecta w wierszu poleceń. Wszystkie 3 rodzaje są przekierowywane przez ten ciąg: >/dev/null 2>&1 - Oczywiście, możesz mieć scrip zawierający okresowe zapisy do osobnego dziennika.
SDsolar

Odpowiedzi:


119

Ustaw linię w ten sposób:

* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null 2>&1

Spowoduje to przechwycenie zarówno STDOUT (1), jak i STDERR (2) i wysłanie ich do /dev/null.

MAILTO

Możesz także wyłączyć wiadomość e-mail, ustawiając, a następnie resetując, MAILTO=""co uniemożliwi wysyłanie wiadomości e-mail.

Przykład

MAILTO=""
* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null 2>&1

MAILTO="admin@somedom.com"
 * * * * *      root    /usr/local/sbin/myothercommand.sh

Dodatkowe wiadomości

Często otrzymujesz następujące rodzaje wiadomości /var/log/syslog:

Nov 11 08:17:01 manny CRON[28381]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

Są to po prostu powiadomienia za pośrednictwem crona, że ​​wykonano katalog cronjobs. Ta wiadomość nie ma nic wspólnego bezpośrednio z tymi zadaniami, zamiast tego pochodzi crondbezpośrednio od demona. Naprawdę nic nie możesz na to poradzić i zachęcam cię, abyś nie wyłączał ich, ponieważ są one prawdopodobnie jedynym oknem, w którym masz dostęp do cronddzienników.

Jeśli są dla ciebie bardzo denerwujące, zawsze możesz skierować je do alternatywnego pliku dziennika, aby uzyskać je z /var/log/syslogpliku, poprzez /etc/syslog.confplik konfiguracyjny dla syslog.


@ rubo77 - czy możesz pokazać przykład? Muszę zobaczyć, co z tym nie działa. Googling pokazuje
slm

Działa to dla wszystkich danych wyjściowych i wiadomości e-mail, ale nadal generuje wiersz dla każdego wywołania cron w / var / log / syslog
rubo77

@ rubo77 - myślałem, że o to pytasz. Nie możesz zatrzymać tych wiadomości, są one generowane przez samego demona crond.
slm

@ rubo77 - Zdaję sobie sprawę ze zmian /etc/syslog.conf, nie uważam tego za alternatywę. To tylko zmieni plik, do którego logi zostaną zrzucone, lub możesz całkowicie wyłączyć wszystkie wiadomości cron razem. Nie ma sposobu na robienie tego, co chcesz.
slm

1
@ rubo77 - jedynym sposobem na zrobienie tego, co chcesz, jest umieszczenie grep -v ...po wywołaniu crond.
slm

10

mieć skrypt, który musi być wykonywany co minutę. Problem polega na tym, że cron loguje się do / var / log / syslog przy każdym uruchomieniu. Skończyło się na tym, że w kółku w / var / log / syslog powtarzał się komunikat, że był on wielokrotnie powtarzany

Ponieważ wydaje się, że nic, co robisz, nie powstrzyma tego, warto zapytać: czym dokładnie jest ten skrypt i jaka jest dokładnie wiadomość, którą widzisz w syslog?

Jeśli sugestia SLM nie zadziałała, dzieje się tak, ponieważ coś loguje się bezpośrednio do syslog - albo cron, jak wydaje się sugerowane w niektórych twoich komentarzach, albo proces uruchamiany przez crona. Wiadomości wysyłane do syslog nie pochodzą ze stdin ani stderr, więc 2>&1&>nie pomogą.

Może istnieć sposób skonfigurowania zachowania danej aplikacji, z wyjątkiem tego, że nie wiemy, co to jest.

Z pewnością istnieje sposób skonfigurowania większości współczesnych implementacji syslog (jest ich kilka) w celu bardzo szczegółowego filtrowania wiadomości. Na przykład jeśli w komunikacie znajduje się unikatowy znacznik, można na niego celować. Ale znowu, ponieważ nie wiemy nic o konkretnej wiadomości ani o tym, którego syslogd używasz, nie ma nic konkretnego, co można by polecić.

Chodzi mi o to, że jeśli nie chcesz przekierowywać / filtrować wiadomości, ponieważ „spowoduje to przekierowanie wszystkich wiadomości”, możesz udoskonalić technikę filtrowania. Wątek błędu serwera, do którego podłączyłeś, wspomina o filtrowaniu według funkcji ( *.cron) - ale możesz skonfigurować bardziej wyspecjalizowane filtry niż to.


Zarówno Debian, jak i Ubuntu mają dostępny rsyslog . W debian 5+ jest to domyślny syslog, na Ubuntu jest to opcja, więc musisz go zainstalować. Aby utworzyć filtr skierowany na określoną zawartość, umieść ją u góry (tj. Przed innymi regułami, ale po ogólnej konfiguracji, załadowaniu modułu itp.) /etc/rsyslog.conf. Najlepszym sposobem na to nie jest rsyslog.confsama edycja , ale utworzenie pliku w /etc/rsyslog.conf.d/katalogu, którego nazwa zaczyna się od dwóch cyfr, które są mniejsze niż 50, tj /etc/rsyslog.conf.d/15-my-filter.conf. Możesz umieścić tam coś takiego:

:msg, contains, "/usr/bin/w3m -no-cookie" /dev/null

Spowoduje to wysłanie wiadomości do /dev/null(lub oddzielnego dziennika, jeśli wolisz). Jednak wiadomość nadal będzie przekazywana przez kolejne reguły, do których ją wysyłają /var/log/syslog. Aby temu zapobiec:

& stop

Natychmiast po tej drugiej linii. Wyrzuca to wszystko, co pasowało do powyższej reguły. Lub, w przypadku reguł jednowierszowych, możesz po prostu dodać stopna końcu tej linii reguł.

Musisz zrestartować rsyslogdpo zmianie konfiguracji (np. W systemach systemd systemctl restart rsyslog):

kill -HUP $(cat /var/run/rsyslogd.pid)

HUP powoduje, że demon sam się restartuje.


Dla rsyslog ~jest teraz przestarzałe i powinno zostać zastąpione przez stop. rsyslogd.confLiczy się także pozycja w pliku. Więc dla rsyslog po prostu użyłbym :msg, contains, "/usr/bin/w3m -no-cookie" stop. A następnie uruchom ponownie sudo systemctl restart rsyslog.
Frank Breitling

4

Zmiana /etc/default/cron

# Or, to log standard messages, plus jobs with exit status != 0:
# EXTRA_OPTS='-L 5'
#
# For quick reference, the currently available log levels are:
#   0   no logging (errors are logged regardless)
#   1   log start of jobs
#   2   log end of jobs
#   4   log jobs with exit status != 0
#   8   log the process identifier of child process (in all logs)
#
EXTRA_OPTS="-L 0"

Domyślnie EXTRA_OPTSlinia to""


2

Przekierowanie w celu /dev/nullukrycia danych wyjściowych polecenia Jeśli tego nie zrobisz, cron prześle Ci wiadomość e-mail. Dane wyjściowe polecenia nigdy nie kończą się w logach systemowych (przynajmniej nie przez crona).

Zazwyczaj przekierowywanie wyjścia jest /dev/nullszczególnie złym pomysłem , zwłaszcza wyjściem błędu: jeśli coś pójdzie nie tak, nie będziesz mieć żadnych informacji, aby zdiagnozować problem. Jeśli nie chcesz otrzymywać wiadomości, przekieruj do pliku dziennika.

Nie ma to jednak znaczenia dla twojego problemu. Cytująca wiadomość pochodzi od samego crona. Cron zapisuje wpis w dzienniku za każdym razem, gdy uruchamia zadanie. Żadna implementacja crona, którą widziałem, nie pozwala używać różnych konfiguracji rejestrowania dla różnych zadań.

Jeśli chcesz pominąć niektóre zadania, jedyną opcją jest zastosowanie filtrowania tekstu do komunikatów dziennika w demonie syslog. De facto standardem filtrowania syslog jest uruchamianie rsyslog (który może, ale nie musi być domyślny w twoim systemie) jako demon syslog. Zobacz odpowiedź goldilocks, jak odfiltrować to polecenie.

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.