Błąd „(CRON) informacji (brak zainstalowanego MTA, odrzucanie danych wyjściowych)” w dzienniku systemowym


198

Mam nową instalację systemu Ubuntu 12.04.1 LTS i wielu serwerów.

Nie dodałem żadnych zadań cron ani nie edytowałem mojego crontab na tych serwerach, jednak mniej więcej w tym samym czasie dla każdej maszyny dostaję 75% skok procesora i następujące informacje w moim dzienniku systemowym w momencie wzrostu:

CRON[8380]: (CRON) info (No MTA installed, discarding output)

Mam zainstalowany mono-complete i uruchamiam serwer internetowy stosu usług.

Jaki jest najlepszy sposób, aby temu zapobiec? Chciałbym móc usunąć skok CPU.


Codziennie o 6:25? Są to skrypty z /etc/cron.daily/. Mam tylko jedną próbę wysłania poczty: konkurs popularności. Przejrzyj swoje skrypty i zobacz, który skrypt próbuje wysłać pocztę? To powinno to zawęzić. Następnie „chmod 0644 /etc/cron.daily/script-name”, aby zapobiec wykonaniu.

Odpowiedzi:


173

Linux używa poczty do wysyłania powiadomień do użytkownika. Większość dystrybucji Linuksa ma zainstalowaną usługę pocztową (w tym MTA). Ubuntu nie.

Możesz zainstalować usługę pocztową, na przykład postfiks, aby rozwiązać ten problem.

sudo apt-get install postfix

Lub możesz to zignorować. Nie sądzę, że niemożność cron do wysyłania wiadomości ma coś wspólnego ze skokiem procesora (jest to związane z podstawowym zadaniem wykonywanym przez cron). Najbezpieczniej jest zainstalować MTA, a następnie przeczytać wiadomości ( muttjest to dobry czytnik poczty systemowej).


5
Czy postfix jest dobrym rozwiązaniem? Który MTA jest najłatwiejszy w użyciu?
endolith,

2
postfix jest najczęściej używanym serwerem pocztowym dla systemu Linux, trzymaj się go
Rápli András

5
Warto zauważyć, że podczas korzystania z crona (to znaczy, jeśli nie chcesz faktycznie wysyłać wiadomości e-mail na zewnątrz) podczas procedury instalacji, powinieneś odpowiedzieć, aby skonfigurować tylko do użytku lokalnego.
steffen

jedynym sposobem wiem, by sprawdzić wiadomości są maildostarczane przez mailutils(Debian), jeśli istnieje lepszy sposób wbudowane w Postfix?
ThorSummoner

79

Dzieje się tak, ponieważ Twoje zadania cron generują dane wyjściowe, a następnie demon cron próbuje wysłać je pocztą e-mail (tj. Root). Jeśli nie potrzebujesz tego wyjścia, najłatwiejszym sposobem rozwiązania tego jest odrzucenie go na crontabie:

sudo crontab -e

i dodaj >/dev/null 2>&1do każdej pracy:

* * * * * yourCommand >/dev/null 2>&1

10
Problem z tym podejściem polega na tym, że nie wyjaśnia to dużego zużycia procesora. Cron najwyraźniej stara się być komunikatywny, co w zasadzie ignoruje wynik. Byłbym bardziej skłonny do obsługi danych wyjściowych niż ich odrzucenia, na wypadek, gdyby były przydatne informacje debugowania.
Oli

1
Oli, chociaż jest to stare pytanie, mam dokładnie ten sam problem, ale dotyczy to Raspberry PI. Widzę No MTA installed, discarding outputw dzienniku kilka wiadomości, a mój program ostatecznie przestaje działać samodzielnie. Wydaje mi się, że dzieje się tak ze względu na skok CPU. Wygląda na to, że wszystkie odpowiedzi na to pytanie wydają się to ignorować.
ThN

4
Aby zachować dane wyjściowe, umieść polecenie w skrypcie, a stdout potoku i stderr do logger. Na przykład yourCommand >/dev/null 2>&1 | logger -t mycmd. Spowoduje to umieszczenie danych wyjściowych w syslog w celu bezpiecznego przechowywania i zatrzymanie skarg MTA.
CivMeierFan

56

W moim przypadku wiadomość wskazywała na problem z uprawnieniami w skrypcie bash, ale nie widziałem go, dopóki nie zainstalowałem MTA.

Zgodnie z sugestią uruchomiłem:

sudo aptitude install postfix

Wybrałem „Lokalny” podczas instalacji i po ponownym uruchomieniu zadania cron:

sudo tail -f /var/mail/<user>

W moim przypadku wymieniłem

<user>

z „rootem”.

Byłem wtedy w stanie zobaczyć wynik błędu związany z uprawnieniami.


3
Dziękujemy za dodatkowy komentarz na temat sprawdzania skrzynki pocztowej, aby zobaczyć błędy z pracy!
Stuart Allen

32

Jak stwierdzono we wcześniejszej odpowiedzi, dzieje się tak, ponieważ zadania cron generują dane wyjściowe, a następnie demon cron próbuje wysłać je pocztą e-mail. Jeśli nie chcesz (lub nie możesz) zainstalować MTA, ale chcesz zobaczyć dane wyjściowe, możesz przekierować dane wyjściowe zadania cron do pliku dziennika. Edytuj plik crontab za pomocą

crontab -e

(użyj, sudojeśli problem dotyczy crontab roota) i dodaj po każdym poleceniu, tak jak poniżej:>> /some/log/file 2>&1

0 3 * * * cmd   >> / some / log / file 2> & 1

Jeśli w wierszu znajduje się wiele poleceń, oddzielonych przez ;,  &&  lub ||, należy wykonać powyższe czynności dla każdego polecenia, w następujący sposób:

0 3 * * * cmd 1   >> / some / log / file 2> & 1;  cmd 2   >> / some / log / file 2> & 1

lub zgrupuj je w następujący sposób:

0 3 * * * ( cmd 1 ;   cmd 2 )   >> / some / log / file 2> & 1

Jeśli chcesz zignorować stdout i przechwycić tylko stderr, użyj zamiast tego. Umieść plik dziennika w dowolnym miejscu - w katalogu domowym , a nawet jeśli masz pewność, że nie będziesz go przechowywać.> /dev/null 2>> /some/log/file/var/log/tmp

Następnie spójrz na plik dziennika po uruchomieniu zadania.


28

W crontab dodaj to jako pierwszy wiersz:

MAILTO=""

Zapobiegnie to próbom wysłania wiadomości e-mail przez crona.


4
Nie umieszczaj żadnych komentarzy ( #) później, MAILTO=""bo to nie zadziała
SBF

23

Jeśli nie chcesz instalować MTA (co obecnie nie jest mi potrzebne), możesz przesłać wyniki zadania cron do pliku dziennika.

sudo crontab -e

wtedy z twoją pracą crona wyglądałoby to tak.

0 3 * * * /cmd/to/run >> /var/log/somelogfile.log

możesz po prostu ogonić dziennik i zobaczyć, co się stało

sudo tail -f -n 50 /var/log/somelogfile.log

To właśnie robiłem na każdym serwerze, na którym widzę tę wiadomość w syslog


Zrobiłem to, ale do pliku nie dodano rejestrowania.
pir

Czy jesteś pewien, że zadanie cron zostało uruchomione?
Andrew MacNaughton,

Tak, dziennik systemu pokazuje, że jest uruchamiany.
pir

1
Potrzebujesz „2> i 1” na końcu linii, aby przechwycić dane wyjściowe do stderr w pliku.
MattSmith

15

To stare pytanie, ale istnieje dodatkowa odpowiedź, która jest przydatna w niektórych okolicznościach.

Przeprowadź wyjście polecenia cron, loggeraby znalazły się w syslog.

Jest to nieco łatwiejsze niż instalacja postfiksa i umieszcza to wyjście w syslog obok innych dzienników. To polecenie przechwytuje stdout AND stderr, więc nie zobaczysz No MTA installedkomunikatu i zobaczysz wszystkie wyniki w syslog.

Przykładowy wpis cron:

0 3 * * * (cmd1;  cmd2) 2>&1 | logger -t mycmd

Możesz przeglądać dzienniki za pomocą swojego tagu, mycmdużywając:

grep 'mycmd' /var/log/syslog

Czy rury działają w zadaniach cron?
CivMeierFan

10

Jedna strona efekt dodawania /dev/null 2>&1do komendy crona jest to, że zarówno odrzucić STDERRi STDOUT(błąd standardowy, jak i wyjście). Działa to dobrze, jeśli nie chcesz żadnych wiadomości e-mail od crona. Ale jeśli chcesz, aby Twoje błędy były wysyłane pocztą e-mail, użyj >/dev/nullzamiast tego. Przeczytaj ten post na blogu, aby uzyskać więcej wyjaśnień .

Jednak nadal będziesz musiał zainstalować MTA (agent przesyłania poczty), aby wysłać e-maile o błędach. Postfix jest wystarczająco prosty do zainstalowania za pomocą:sudo apt-get install postfix


O ile rozumiem „> / dev / null” wyśle ​​je tylko, a „> / dev / null 2> & 1” spowoduje doscard wszystkich błędów? Czego musiałbym użyć, aby uzyskać błędy w dzienniku, ale żadnych wiadomości e-mail? Teraz nie dostaję żadnych e-maili (tak, jak chcę), ale brzydkie „bez MTA…”
Pit

2
afaik, nie ma innego sposobu na zapisanie wyniku niż wysłanie go do wiadomości e-mail. Najbliższą rzeczą, jaką możesz zrobić, to skonfigurować postfiks do lokalnego dostarczania poczty (jeśli uruchomisz „sudo apt-get install postfix”, pojawi się monit, czy chcesz skonfigurować dostarczanie lokalne. Chociaż początkowo wyglądało to na ból, w rzeczywistości działa o wiele lepiej. Ilekroć loguję się przez ssh, widzę nowy e-mail na maszynie, jeśli poprzednie zadanie się nie powiodło. Uważam, że jest to wygodniejsze niż sprawdzanie dziennika.
paneer_tikka

2
  1. Najpierw zainstaluj postfix, aby rozwiązać problem

    sudo apt-get install postfix
    
  2. Jeśli Ubuntu, możesz edytować crontabplik

    sudo vim /etc/crontab
    
  3. Uwaga, edytuj górny plik, nie kod w pierwszym wierszu, i wpisz

    MAILTO=root // current system user
    
  4. Po cronwykonaniu dowolnego zadania otrzymasz wiadomość e-mail

    mail
    

1
Twoja odpowiedź wydaje się być dobra, ale nie mogłem zrozumieć wszystkich instrukcji. Może możesz to poprawić.
zx485,


1

Miałem ten problem przy użyciu narzędzi Kitematic Docker .
Idź do pojemnika magento i kliknij exe.

Następnie uruchomić

apt-get update

Dzieje się tak, jeśli próbujesz uruchomić Magento na Kitematic. Dziennik pokaże ten błąd na maszynie wirtualnej:

potrzebuję aktualizacji.

Przepraszam, jeśli się zgubiłeś, ale tak to działa. Gubisz się, ale po prostu poczytaj o tym, a kawałki pewnego dnia się połączą. Bądź cierpliwy.

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.