Error de "información (CRON) (sin MTA instalado, descartando la salida)" en el syslog

198

Tengo una nueva instalación de Ubuntu 12.04.1 LTS y varios servidores.

No he agregado ningún trabajo cron ni editado mi crontab en esos servidores, sin embargo, aproximadamente al mismo tiempo para cada máquina, obtengo un pico de CPU del 75% y la siguiente información en mi syslog en el momento del pico:

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

Tengo monocompleto instalado y estoy ejecutando un servidor web de pila de servicios.

¿Cuál es la mejor manera para evitar que esto suceda? Me gustaría poder eliminar el pico de CPU.

sungiant
fuente
Todos los días a las 6:25? Esos son scripts de /etc/cron.daily/. Solo tengo uno tratando de enviar correo: concurso de popularidad. Mire sus scripts y vea qué script está tratando de enviar correo. Eso debería reducirlo. Luego 'chmod 0644 /etc/cron.daily/script-name' para evitar la ejecución.

Respuestas:

173

Linux usa el correo para enviar notificaciones al usuario. La mayoría de las distribuciones de Linux tienen instalado un servicio de correo (incluido un MTA). Ubuntu no lo hace.

Puede instalar un servicio de correo, postfix por ejemplo, para resolver este problema.

sudo apt-get install postfix

O puedes ignorarlo. No creo que la incapacidad de cron para enviar mensajes tenga algo que ver con el pico de CPU (que está vinculado al trabajo subyacente que está ejecutando cron). Puede ser más seguro instalar un MTA y luego leer los mensajes ( muttes un buen lector de correo del sistema).

martín
fuente
55
¿Es bueno instalar Postfix? ¿Qué MTA es más fácil de usar?
endolito el
2
postfix es el servidor de correo más utilizado para Linux,
adhiérase
55
Vale la pena señalar que para usar con cron (es decir, si no desea enviar un correo electrónico hacia afuera) durante el procedimiento de instalación, debe responder para configurar solo para uso local.
steffen
(debian) mailproporciona la única forma de verificar el correo mailutils, si hay una mejor manera integrada de postfix?
ThorSummoner
79

Esto sucede porque sus trabajos cron están produciendo salida y luego el demonio cron intenta enviarle esa salida por correo electrónico (es decir, root). Si no necesita esa salida, la forma más fácil de resolver esto es descartarla en el crontab:

sudo crontab -e

y agregar >/dev/null 2>&1a cada trabajo:

* * * * * yourCommand >/dev/null 2>&1
robar
fuente
10
El problema con este enfoque es que no explica el alto uso de la CPU. Cron claramente está tratando de ser comunicativo y esto esencialmente solo ignora la salida. Estaría más inclinado a manejar la salida que a descartarla, en caso de que haya información de depuración útil.
Oli
1
Oli, a pesar de que esta es una vieja pregunta, estoy experimentando el mismo problema exacto pero está en Raspberry PI. Veo un montón de No MTA installed, discarding outputmensajes en el registro y mi programa finalmente deja de ejecutarse por sí solo. Creo que es debido al pico de la CPU. Parece que toda la respuesta publicada para esta pregunta parece ignorar eso.
Jue
44
Para mantener la salida, coloque el comando en un script y canalice stdout y stderr a logger. Por ejemplo, yourCommand >/dev/null 2>&1 | logger -t mycmd. Esto colocará la salida en syslog para un mantenimiento seguro y detendrá las quejas de MTA.
CivMeierFan
56

En mi caso, el mensaje insinuaba un problema de permisos con el script bash, pero no pude verlo hasta que instalé un MTA.

Como sugerí, corrí:

sudo aptitude install postfix

Elegí "Local" durante la configuración y después de ejecutar el trabajo cron nuevamente:

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

En mi caso reemplacé

<user>

con "raíz".

Luego pude ver la salida de error relacionada con los permisos.

Martin Carstens
fuente
3
¡Gracias por el comentario adicional sobre cómo revisar el buzón para ver los errores del trabajo!
Stuart Allen
32

Como se indicó en una respuesta anterior, esto sucede porque sus trabajos cron están produciendo resultados, y luego el demonio cron intenta enviarle ese resultado por correo electrónico. Si no desea (o no puede) instalar un MTA, pero desea ver la salida, puede redirigir la salida del trabajo cron a un archivo de registro. Edite su archivo crontab con

crontab -e

(utilícelo sudosi el problema es con el crontab de la raíz) y agregue después de cada comando, así:>> /some/log/file 2>&1

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

Si hay varios comandos en una línea, separados por ;,  &&  o ||, debe hacer lo anterior para cada comando, así:

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

o agruparlos, así:

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

Si desea ignorar stdout y capturar solo stderr, use en su lugar. Coloque el archivo de registro donde desee: su directorio de inicio , o incluso si está seguro de que no necesitará conservarlo.> /dev/null 2>> /some/log/file/var/log/tmp

Luego mire el archivo de registro después de que se ejecute el trabajo.

G-Man
fuente
29

En crontab agregue esto como primera línea:

MAILTO=""

Esto evitará que cron intente enviar un correo electrónico.

88 pesado
fuente
44
No ponga ningún comentario ( #) después MAILTO=""o no funcionará
SBF
23

Si no desea instalar un MTA (que actualmente no necesito), puede canalizar los resultados del trabajo cron a un archivo de registro.

sudo crontab -e

entonces con tu trabajo cron se vería así.

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

entonces puedes simplemente seguir el registro y ver qué pasó

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

Esto es lo que he estado haciendo en cualquier servidor que veo ese mensaje en syslog

Andrew MacNaughton
fuente
He hecho esto, pero no se agrega ningún registro al archivo.
pir
¿Estás seguro de que el trabajo cron se ha estado ejecutando?
Andrew MacNaughton
Sí, el registro del sistema muestra que se está iniciando.
pir
1
Necesita '2> & 1' al final de la línea para capturar la salida para stderr en el archivo.
MattSmith
15

Esta es una vieja pregunta, pero hay una respuesta adicional que es útil en algunas circunstancias.

Canalice la salida de su comando cron loggerpara que terminen en el syslog.

Es un poco más fácil que instalar postfix, y pone esta salida en syslog junto con sus otros registros. Este comando capturará stdout AND stderr para que no vea el No MTA installedmensaje y verá toda su salida en el syslog.

Ejemplo de entrada cron:

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

Puede ver los registros con su etiqueta mycmdusando:

grep 'mycmd' /var/log/syslog
Michael Hunter
fuente
¿Las tuberías funcionan en trabajos cron?
CivMeierFan
10

Un efecto secundario de agregar /dev/null 2>&1al comando cron job es que descartará ambos STDERRy STDOUT(Error estándar, así como Salida). Esto funciona bien si no desea ningún correo electrónico de cron. Pero si desea que le enviemos sus errores por correo electrónico, úselos >/dev/nullen su lugar. Lea esta publicación de blog para obtener más explicaciones .

Sin embargo, aún deberá instalar un MTA (agente de transferencia de correo) para enviar los correos electrónicos de error. Postfix es bastante simple de instalar con:sudo apt-get install postfix

paneer_tikka
fuente
Según tengo entendido, '> / dev / null' solo los enviará, y '> / dev / null 2> & 1' descartará todos los errores. ¿Qué tendría que usar para obtener errores en el registro pero no en los correos? Ahora no recibo correos (como lo quiero) pero el feo 'no MTA ...'
Hoyo
2
afaik, no hay forma de registrar la salida que no sea enviarla a correos electrónicos. Lo más parecido que puede hacer es configurar postfix para la entrega de correo local (si ejecuta "sudo apt-get install postfix", le preguntará si desea configurar la entrega local. Si bien esto parecía un problema inicialmente, en realidad funciona .. mucho mejor Cada vez que me conecto a través de SSH, veo un nuevo correo electrónico en la máquina si un trabajo anterior ha fallado lo encuentro más cómodo que tener que comprobar el registro.
paneer_tikka
2
  1. Al principio, instale postfix, eso puede resolver el problema

    sudo apt-get install postfix
    
  2. Si es Ubuntu, puedes editar el crontabarchivo

    sudo vim /etc/crontab
    
  3. Atención, edite el archivo superior, ningún código en la primera línea, e ingrese

    MAILTO=root // current system user
    
  4. Cuando cronejecute cualquier tarea, recibirá un correo electrónico

    mail
    
shahramlu
fuente
1
Tu respuesta parece ser buena, pero no pude entender todas las instrucciones. Quizás puedas mejorarlo.
zx485
1

Tuve este problema usando las herramientas Kitematic Docker .
Vaya al contenedor magento y haga clic en exe.

Entonces corre

apt-get update

Esto es si estás intentando que magento se ejecute en kitematic. El registro mostrará este error en la máquina virtual:

Necesita actualización.

Lo siento si esto te hizo perder, pero así es como funciona. Sigue perdiéndose, pero solo lea sobre esto y las piezas se unirán algún día. Se paciente.

Ali Bayati
fuente