Erro "Informações (CRON) (sem MTA instalado, descartando saída)" no syslog

198

Eu tenho uma nova instalação do Ubuntu 12.04.1 LTS e vários servidores.

Eu não adicionei nenhum trabalho cron ou editei meu crontab nesses servidores; no entanto, ao mesmo tempo em cada máquina, recebo um pico de CPU de 75% e as seguintes informações no meu syslog no momento do pico:

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

Eu tenho o mono-complete instalado e estou executando um servidor da web da pilha de serviços.

Qual é a melhor maneira de impedir que isso aconteça? Gostaria de poder remover o pico da CPU.

sungente
fonte
Todos os dias às 6:25? Esses são scripts de /etc/cron.daily/. Eu tenho apenas um tentando enviar e-mail: concurso de popularidade. Observe seus scripts e veja qual script está tentando enviar email? Isso deve restringir isso. Em seguida, 'chmod 0644 /etc/cron.daily/script-name' para impedir a execução.

Respostas:

173

O Linux usa correio para enviar notificações ao usuário. A maioria das distribuições Linux possui um serviço de email (incluindo um MTA) instalado. O Ubuntu não faz isso.

Você pode instalar um serviço de email, postfix por exemplo, para resolver esse problema.

sudo apt-get install postfix

Ou você pode ignorá-lo. Eu não acho que a incapacidade do cron enviar mensagens tenha algo a ver com o pico da CPU (que está vinculado ao trabalho subjacente que o cron está executando). Pode ser mais seguro instalar um MTA e depois ler as mensagens ( mutté um bom leitor de correio do sistema).

Martin
fonte
5
O postfix é uma boa coisa para instalar? Qual MTA é mais fácil de usar?
endolith 26/11
2
postfix é o servidor de correio mais amplamente utilizado para linux, cumpri-lo
Rápli András
5
Vale ressaltar que, para uso com o cron (ou seja, se você não deseja realmente enviar e-mails para fora) durante o procedimento de instalação, você deve responder para configurar apenas para uso local.
Steffen
a única maneira que eu sei verificar e-mails é mailfornecida pelo mailutils(debian), se houver uma maneira melhor incorporada ao postfix?
ThorSummoner
79

Isso acontece porque seus trabalhos cron estão produzindo saída e, em seguida, o daemon cron tenta enviar essa saída por e-mail para você (ou seja, root). Se você não precisar dessa saída, a maneira mais fácil de resolver isso é descartá-la no crontab:

sudo crontab -e

e adicione >/dev/null 2>&1a todos os trabalhos:

* * * * * yourCommand >/dev/null 2>&1
roubar
fonte
10
O problema dessa abordagem é que ela não explica o alto uso da CPU. Cron está claramente tentando ser comunicativo e isso basicamente ignora a saída. Eu estaria mais inclinado a lidar com a saída do que descartá-la, caso haja informações úteis sobre depuração.
Oli
1
Oli, mesmo que essa seja uma pergunta antiga, estou enfrentando o mesmo problema exato, mas está no Raspberry PI. Vejo um monte de No MTA installed, discarding outputmensagens no log e meu programa eventualmente pára de executar por conta própria. Eu acredito que é por causa do pico da CPU. Parece que toda a resposta postada para esta pergunta parece ignorar isso.
ThN 18/01/19
4
Para manter a saída, coloque o comando em um script e envie stdout e stderr para logger. Por exemplo yourCommand >/dev/null 2>&1 | logger -t mycmd,. Isso colocará a saída no syslog para fins de segurança e interromperá as reclamações do MTA.
CivMeierFan 13/02/2019
56

No meu caso, a mensagem estava sugerindo um problema de permissão com o script bash, mas não consegui vê-la até instalar um MTA.

Como sugeri, corri:

sudo aptitude install postfix

Eu escolhi "Local" durante a instalação e depois de executar o trabalho cron novamente:

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

No meu caso eu substituí

<user>

com "raiz".

Pude ver a saída de erro relacionada às permissões.

Martin Carstens
fonte
3
Obrigado pelo comentário extra sobre como verificar a caixa de correio para ver erros do trabalho!
Stuart Allen
32

Conforme declarado em uma resposta anterior, isso acontece porque seus trabalhos cron estão produzindo saída e, em seguida, o daemon cron tenta enviar essa saída por email para você. Se você não deseja (ou não pode) instalar um MTA, mas deseja ver a saída, pode redirecionar a saída da tarefa cron para um arquivo de log. Edite seu arquivo crontab com

crontab -e

(use sudose o problema for com o crontab do root) e adicione após cada comando, como este:>> /some/log/file 2>&1

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

Se houver vários comandos em uma linha, separados por ;,  &&  ou ||, você deve fazer o acima para cada comando, assim:

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

ou agrupe-os, assim:

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

Se você deseja ignorar o stdout e capturar apenas o stderr, use-o . Coloque o arquivo de log onde quiser - seu diretório pessoal ou mesmo se tiver certeza de que não precisará mantê-lo.> /dev/null 2>> /some/log/file/var/log/tmp

Em seguida, observe o arquivo de log após a execução da tarefa.

G-Man
fonte
28

No crontab, adicione isso como primeira linha:

MAILTO=""

Isso impedirá que o cron tente enviar um email.

88ponderado
fonte
4
Não coloque nenhum comentário ( #) depois MAILTO=""ou não funcionará #
SBF
23

Se você não deseja instalar um MTA (do qual atualmente não preciso), pode canalizar os resultados do trabalho cron para um arquivo de log.

sudo crontab -e

então, com seu trabalho cron, ficaria assim.

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

então você pode simplesmente seguir o log e ver o que aconteceu

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

Isto é o que tenho feito em qualquer servidor que vejo essa mensagem no syslog

Andrew MacNaughton
fonte
Eu fiz isso, mas nenhum log é adicionado ao arquivo.
Pir
Você tem certeza de que o trabalho cron está sendo executado?
Andrew MacNaughton
Sim, o log do sistema mostra que está sendo iniciado.
pir
1
Você precisa de '2> & 1' no final da linha para capturar a saída para stderr no arquivo.
precisa saber é o seguinte
15

Essa é uma pergunta antiga, mas há uma resposta adicional que é útil em algumas circunstâncias.

Canalize a saída do seu comando cron loggerpara que eles acabem no syslog.

É um pouco mais fácil do que instalar o postfix, e coloca essa saída no syslog ao lado dos outros logs. Este comando irá capturar stdout AND stderr para que você não veja a No MTA installedmensagem e veja toda a sua saída no syslog.

Exemplo de entrada cron:

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

Você pode visualizar os logs com sua tag mycmdusando:

grep 'mycmd' /var/log/syslog
Michael Hunter
fonte
Os pipes funcionam em tarefas cron?
CivMeierFan 13/02/2019
10

Um efeito colateral da adição /dev/null 2>&1ao comando cron job é que ele descartará ambos STDERRe STDOUT(erro padrão e saída). Isso funciona bem se você não quiser nenhum e-mail do cron. Mas se você deseja que seus erros sejam enviados por e-mail, use-o >/dev/null. Leia esta postagem do blog para obter mais explicações .

Você ainda precisará instalar um MTA (agente de transferência de email) para enviar os emails de erro. O Postfix é simples o suficiente para instalar com:sudo apt-get install postfix

paneer Tikka
fonte
Tanto quanto eu entendi, '> / dev / null' os enviará apenas e '> / dev / null 2> & 1' irá doscard todos os erros? O que eu precisaria usar para obter erros no log, mas sem e-mails? Agora eu não obter mails (como eu quero), mas o feio 'não MTA ...'
Pit
2
depois, não há como registrar a saída a não ser enviá-la para e-mails. O mais próximo que você pode fazer é configurar o postfix para entrega de correio local (se você executar "sudo apt-get install postfix", ele perguntará se você deseja configurar a entrega local. Embora parecesse um problema inicialmente, ele realmente funciona .. muito melhor Sempre que eu login via ssh, eu vejo um novo e-mail na máquina se um trabalho anterior falhou Acho que é mais conveniente do que ter que verificar o log.
paneer_tikka
2
  1. Inicialmente, instale postfix, isso pode resolver o problema

    sudo apt-get install postfix
    
  2. Se o Ubuntu, você pode editar o crontabarquivo

    sudo vim /etc/crontab
    
  3. Atenção , edite o arquivo superior , nenhum código na primeira linha , e digite

    MAILTO=root // current system user
    
  4. Ao cronexecutar qualquer tarefa, você receberá um email

    mail
    
shahramlu
fonte
1
Sua resposta parece ser boa, mas não consegui entender todas as instruções. Talvez você possa melhorar.
zx485 19/09/19
1

Eu tive esse problema usando as ferramentas do Kitematic Docker .
Vá para o contêiner magento e clique em exe.

Então corra

apt-get update

Isto é, se você está tentando executar o magento no kitematic. O log mostrará este erro na máquina virtual:

precisa de atualização.

Desculpe se isso te deixou perdido, mas é assim que funciona. Você continua se perdendo, mas apenas leia sobre isso e as peças se reunirão um dia. Seja paciente.

Ali Bayati
fonte