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/syslog
każ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.hourly
pliku.
źródło
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).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.Odpowiedzi:
Ustaw linię w ten sposób:
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
Dodatkowe wiadomości
Często otrzymujesz następujące rodzaje wiadomości
/var/log/syslog
: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
crond
bezpoś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 docrond
dzienników.Jeśli są dla ciebie bardzo denerwujące, zawsze możesz skierować je do alternatywnego pliku dziennika, aby uzyskać je z
/var/log/syslog
pliku, poprzez/etc/syslog.conf
plik konfiguracyjny dlasyslog
.źródło
/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.grep -v ...
po wywołaniucrond
.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 jestrsyslog.conf
sama 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: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: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ć
stop
na końcu tej linii reguł.Musisz zrestartować
rsyslogd
po zmianie konfiguracji (np. W systemach systemdsystemctl restart rsyslog
):HUP powoduje, że demon sam się restartuje.
źródło
~
jest teraz przestarzałe i powinno zostać zastąpione przezstop
.rsyslogd.conf
Liczy 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 ponowniesudo systemctl restart rsyslog
.Zmiana
/etc/default/cron
Domyślnie
EXTRA_OPTS
linia to""
źródło
Przekierowanie w celu
/dev/null
ukrycia 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/null
szczegó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.
źródło