Erreur «(CRON) info (aucun MTA n'est installé, sortie rejetée)» erreur dans le syslog

198

J'ai une nouvelle installation d'Ubuntu 12.04.1 LTS et un certain nombre de serveurs.

Je n'ai pas ajouté de tâches cron ni modifié ma crontab sur ces serveurs. Cependant, à peu près au même moment pour chaque machine, j'obtiens un pic de 75% de la CPU et les informations suivantes dans mon syslog au moment du pic:

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

Mono-complete est installé et j'utilise un serveur Web de pile de services.

Quel est le meilleur moyen pour moi d'empêcher que cela se produise? Je voudrais pouvoir enlever le pic du processeur.

sungiant
la source
Tous les jours à 6h25? Ce sont des scripts de /etc/cron.daily/. Je n’en ai qu’un qui essaie d’envoyer du courrier: le concours de popularité. Regardez bien vos scripts et voyez quel script tente d'envoyer du courrier? Cela devrait le réduire. Puis, 'chmod 0644 /etc/cron.daily/script-name' pour empêcher l'exécution.

Réponses:

173

Linux utilise la messagerie pour envoyer des notifications à l'utilisateur. Un service de messagerie (y compris un MTA) est installé sur la plupart des distributions Linux. Ubuntu ne le fait pas.

Vous pouvez installer un service de messagerie, postfix par exemple, pour résoudre ce problème.

sudo apt-get install postfix

Ou vous pouvez l'ignorer. Je ne pense pas que l'incapacité de cron d'envoyer des messages ait quelque chose à voir avec le pic du processeur (lié au travail sous-jacent que cron est en cours d'exécution). Il peut être plus sûr d’installer un MTA puis de lire les messages ( muttc’est un bon lecteur de courrier système).

Martin
la source
5
Postfix est-il une bonne chose à installer? Quel MTA est le plus facile à utiliser?
endolith
2
postfix est le serveur de messagerie le plus utilisé pour linux,
restez-y
5
Il convient de noter que, lors de l’installation avec cron (c’est-à-dire si vous ne voulez pas réellement envoyer de courrier électronique) au cours de la procédure d’installation, vous devez configurer la configuration pour une utilisation locale uniquement.
steffen
le seul moyen que je connaisse de vérifier le courrier est mailfourni par mailutils(debian), s’il existe un meilleur moyen de postfix?
ThorSummoner
79

Cela se produit parce que vos tâches cron produisent une sortie, puis le démon cron essaie de vous envoyer cette sortie par e-mail (c.-à-d. Root). Si vous n'avez pas besoin de cette sortie, le moyen le plus simple de résoudre ce problème est de le supprimer à la crontab:

sudo crontab -e

et ajouter >/dev/null 2>&1à chaque travail:

* * * * * yourCommand >/dev/null 2>&1
Rob
la source
10
Le problème avec cette approche est qu’elle n’explique pas l’utilisation élevée du processeur. Cron essaie clairement d'être communicatif et ceci consiste essentiellement à ignorer le résultat. Je serais plus enclin à gérer la sortie que de la jeter, juste au cas où il y aurait des informations de débogage utiles.
Oli
1
Oli, même s’il s’agit d’une vieille question, j’expérimente exactement le même problème, mais c’est sur Raspberry PI. Je vois un tas de No MTA installed, discarding outputmessages dans le journal et mon programme cesse finalement de fonctionner tout seul. Je crois que c'est à cause de la pointe du processeur. Il semble que toute la réponse affichée pour cette question semble ignorer cela.
ThN
4
Pour conserver la sortie, placez la commande dans un script, puis dirigez pipe vers stdout et stderr logger. Par exemple, yourCommand >/dev/null 2>&1 | logger -t mycmd. Cela mettra la sortie dans syslog pour la garder en sécurité et arrêtera les plaintes du MTA.
CivMeierFan
56

Dans mon cas, le message faisait allusion à un problème d'autorisations avec le script bash, mais je ne pouvais le voir qu'après avoir installé un MTA.

Comme suggéré j'ai couru:

sudo aptitude install postfix

J'ai choisi "Local" lors de l'installation et après avoir exécuté le travail cron à nouveau:

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

Dans mon cas j'ai remplacé

<user>

avec "root".

J'ai ensuite pu voir la sortie d'erreur liée aux autorisations.

Martin Carstens
la source
3
Merci pour le commentaire supplémentaire sur la façon de vérifier la boîte aux lettres pour voir les erreurs du travail!
Stuart Allen
32

Comme indiqué dans une réponse précédente, cela se produit car vos tâches cron produisent une sortie, puis le démon cron tente de vous envoyer cette sortie par courrier électronique. Si vous ne voulez pas (ou ne pouvez pas) installer un MTA, mais que vous voulez voir le résultat, vous pouvez rediriger le résultat du travail cron vers un fichier journal. Editez votre fichier crontab avec

crontab -e

(utilisez sudosi le problème est avec la crontab de root) et ajoutez après chaque commande, comme ceci:>> /some/log/file 2>&1

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

Si plusieurs commandes sur une ligne, séparés par ;,  &&  ou ||, vous devez faire ci - dessus pour chaque commande, comme ceci:

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

ou groupez-les, comme ceci:

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

Si vous voulez ignorer stdout et ne capturer que stderr, utilisez plutôt. Placez le fichier journal où vous le souhaitez - votre répertoire personnel ou même si vous êtes certain de ne pas le conserver.> /dev/null 2>> /some/log/file/var/log/tmp

Ensuite, consultez le fichier journal une fois le travail exécuté.

G-Man
la source
29

Dans crontab, ajoutez ceci en première ligne:

MAILTO=""

Cela empêchera cron d’essayer d’envoyer un courrier électronique.

88 pesé
la source
4
Ne mettez pas de commentaires ( #) après MAILTO=""ou si cela ne fonctionnera pas
SBF
23

Si vous ne souhaitez pas installer un MTA (ce dont je n'ai actuellement pas besoin), vous pouvez diriger les résultats du travail cron vers un fichier journal.

sudo crontab -e

alors avec votre travail cron ressemblerait à ceci.

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

alors vous pouvez simplement suivre le journal et voir ce qui s'est passé

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

C’est ce que j’ai fait sur n’importe quel serveur où je vois ce message dans syslog

Andrew MacNaughton
la source
Je l'ai fait, mais aucune journalisation n'est ajoutée au fichier.
pir
Êtes-vous sûr que le travail cron a été exécuté?
Andrew MacNaughton
Oui, le journal du système indique qu'il est en cours de démarrage.
pir.
1
Vous avez besoin de '2> & 1' à la fin de la ligne pour capturer la sortie dans stderr dans le fichier.
MattSmith
15

C'est une vieille question, mais une réponse supplémentaire est utile dans certaines circonstances.

Transférez le résultat de votre commande cron loggerpour qu’ils se retrouvent dans le journal système.

C'est un peu plus facile que d'installer postfix, et il met cette sortie dans syslog à côté de vos autres journaux. Cette commande capturera stdout ET stderr afin que vous ne voyiez pas le No MTA installedmessage et que toutes vos sorties apparaissent dans le journal système.

Exemple d'entrée cron:

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

Vous pouvez afficher les journaux avec votre tag en mycmdutilisant:

grep 'mycmd' /var/log/syslog
Michael Hunter
la source
Les pipes fonctionnent-elles dans les tâches cron?
CivMeierFan
10

Un effet secondaire consistant à ajouter /dev/null 2>&1à la commande cron, est que cela entraînera la perte à la fois STDERRet STDOUT(erreur standard, ainsi que la sortie). Cela fonctionne très bien si vous ne voulez pas d’emails de la part de cron. Mais si vous souhaitez que vos erreurs vous soient envoyées par courrier électronique, utilisez >/dev/nullplutôt. Lisez cet article pour plus d'explications .

Vous devrez néanmoins installer un agent de transfert de courrier (MTA) pour envoyer les courriels d'erreur. Postfix est assez simple pour installer avec:sudo apt-get install postfix

paneer_tikka
la source
Autant que je sache, '> / dev / null' n'enverra que les envoyer, et '> / dev / null 2> & 1' annuleront toutes les erreurs? Que devrais-je utiliser pour obtenir des erreurs dans le journal mais pas de courrier? Je ne reçois plus de courrier (comme je le veux) mais le vilain 'non MTA…'
Pit
2
Autant que je sache, il n'y a pas d'autre moyen de consigner le résultat que de l'envoyer à des courriels. La chose la plus proche que vous puissiez faire est de configurer postfix pour la distribution du courrier local (si vous exécutez "sudo apt-get install postfix", il vous demande si vous souhaitez configurer la distribution locale. Bien que cela ait semblé pénible à l'origine, cela fonctionne réellement. Chaque fois que je me connecte via ssh, je vois un nouvel email sur la machine si un travail précédent a échoué. Je le trouve plus pratique que de devoir consulter le journal.
paneer_tikka
2
  1. Au début, installer postfix, cela peut résoudre le problème

    sudo apt-get install postfix
    
  2. Si Ubuntu, vous pouvez éditer le crontabfichier

    sudo vim /etc/crontab
    
  3. Attention , éditez le fichier supérieur , pas de code dans la première ligne et entrez

    MAILTO=root // current system user
    
  4. Quand cronexécute une tâche, vous recevrez un email

    mail
    
Shahramlu
la source
1
Votre réponse semble être bonne, mais je ne pouvais pas comprendre toutes les instructions. Peut-être que vous pouvez l'améliorer.
Zx485
1

J'ai eu ce problème en utilisant les outils Kitematic Docker .
Allez dans le conteneur magento et cliquez sur exe.

Puis courir

apt-get update

C'est si vous essayez de faire tourner magento sur kitematic. Le journal affichera cette erreur sur la machine virtuelle:

besoin de mise à jour.

Désolé si cela vous a perdu, mais c'est comme ça que ça marche. Vous continuez à vous perdre, mais lisez à ce sujet et les morceaux se réuniront un jour. Sois patient.

Ali Bayati
la source