292 votes

"(CRON) info (No MTA installed, discarding output)" erreur dans le syslog

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

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

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

J'ai installé mono-complete et j'utilise un serveur web à pile de services.

Quel est le meilleur moyen pour moi d'empêcher que cela se produise ? J'aimerais pouvoir supprimer le pic de CPU.

229voto

martin Points 2306

Linux utilise le courrier électronique pour envoyer des notifications à l'utilisateur. La plupart des distributions Linux ont un service de messagerie incluant un MTA (Mail Transfer Agent) installé. Ubuntu n'en a 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 à envoyer des messages ait quoi que ce soit à voir avec le pic de CPU (qui est lié au travail sous-jacent que cron exécute). Il serait peut-être plus sûr d'installer un MTA et de lire ensuite les messages ( mutt est un bon lecteur de courrier système).

118voto

rob Points 1213

Cela se produit parce que vos tâches cron produisent un résultat et que le démon cron essaie de vous envoyer ce résultat par courriel (c'est-à-dire à l'administrateur). Si vous n'avez pas besoin de cette sortie, la façon la plus simple de résoudre ce problème est de la supprimer dans la crontab :

sudo crontab -e

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

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

86voto

Martin Carstens Points 961

Dans mon cas, le message faisait allusion à un problème de permissions avec le script bash script, mais je ne pouvais pas le voir jusqu'à ce que j'installe un MTA.

Comme suggéré, j'ai couru :

sudo aptitude install postfix

J'ai choisi "Local" pendant l'installation et après avoir relancé la tâche cron :

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

Dans mon cas, j'ai remplacé

<user>

avec "racine".

J'ai alors pu voir la sortie d'erreur liée aux permissions.

63voto

Comme indiqué dans une réponse précédente, cela arrive parce que vos tâches cron produisent des résultats, et que le démon cron essaie de vous envoyer ce résultat par e-mail.  Si vous ne voulez pas (ou ne pouvez pas) installer un MTA, mais que vous voulez voir la sortie, vous pouvez rediriger la sortie de la tâche cron vers un fichier journal.  Modifiez votre fichier crontab avec

crontab -e

(utiliser sudo si le problème se situe au niveau de la crontab de root) et ajoutez >> _/some/log/file_ 2>&1 après chaque commande, comme ceci :

0 3 \* \* \* _cmd_  >> _/some/log/file_ 2>&1

( >> _/some/log/file_ envoie la sortie standard vers le fichier nommé, en ajoutant à tout contenu existant, et  2>&1 envoie les messages d'erreur au même endroit).

S'il y a plusieurs commandes sur une ligne, séparées par ; , & , && o || , vous devez faire ce qui précède pour chaque commande, comme ceci :

0 3 \* \* \* _cmd1_  >> _/some/log/file_ 2>&1;  _cmd2_  >> _/some/log/file_ 2>&1

ou les regrouper, comme ceci :

0 3 \* \* \* **(**_cmd1_;  _cmd2_**)**  >> _/some/log/file_ 2>&1

Si la ligne de commande se termine par & , insérer la redirection après la commande mais avant la  & .  S'il y a des commandes séparées par  | (un pipeline), la solution simple consiste à les regrouper :

0 3 \* \* \* (_cmd1_  |  _cmd2_)  >> _/some/log/file_ 2>&1

mais voir aussi le dernier paragraphe, ci-dessous.

Si vous voulez ignorer stdout et capturer uniquement stderr, utilisez > /dev/null 2>> _/some/log/file_ à la place.  Mettez le fichier journal où vous voulez - dans votre répertoire personnel, /var/log ou encore /tmp si tu es sûr que tu n'auras pas besoin de le garder.

Regardez ensuite le fichier journal après l'exécution de la tâche.

Si vous trouvez un désordre de messages entrelacés, il se peut que le(s) programme(s) écrive(nt) stdout et stderr en même temps avec une mauvaise coordination.  Dans ce cas, essayez de les écrire dans des fichiers séparés avec >> _/some/log/file1_  2>> _/some/log/file2_ .  Vous devrez peut-être faire quelque chose de similaire avec les pipelines :

0 3 \* \* \* _cmd1_  2>> _/some/log/filecmd1err_  |  _cmd2_  >> _/some/log/filecmd2_ 2>&1

(Il est probablement aussi préférable d'utiliser des fichiers séparés pour les commandes séparées par  & .)

56voto

Michael Hunter Points 661

Il s'agit d'une vieille question, mais il existe une réponse supplémentaire qui est utile dans certaines circonstances.

Transférer la sortie de votre commande cron à travers logger pour qu'ils finissent dans le syslog.

C'est un peu plus facile que d'installer postfix, et cela place cette sortie dans syslog avec vos autres journaux. Cette commande capturera stdout ET stderr de sorte que vous ne verrez pas l'icône No MTA installed et vous verrez tous vos résultats dans le syslog.

Exemple d'entrée cron :

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

Vous pouvez consulter les journaux avec votre tag mycmd en utilisant :

grep 'mycmd' /var/log/syslog

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X