系统日志中出现“(CRON) 信息(未安装 MTA,丢弃输出)”错误

系统日志中出现“(CRON) 信息(未安装 MTA,丢弃输出)”错误

我在一些服务器上全新安装了 Ubuntu 12.04.1 LTS。

我没有在这些服务器上添加任何 cron 作业或编辑我的 crontab,但是,在大约同一时间,每台机器的 CPU 都会出现 75% 的峰值,并且在峰值发生时我的系统日志中会出现以下信息:

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

我已经安装了 mono-complete 并且正在运行服务堆栈网络服务器。

有什么最好的方法可以阻止这种情况发生?我希望能够消除 CPU 峰值。

答案1

Linux 使用邮件向用户发送通知。大多数 Linux 发行版都安装了邮件服务,其中包括 MTA(邮件传输代理)。但 Ubuntu 没有。

您可以安装邮件服务(例如 postfix)来解决此问题。

sudo apt-get install postfix

或者您可以忽略它。我认为 cron 无法发送消息与 CPU 峰值无关(这与 cron 正在运行的底层作业有关)。最安全的做法可能是安装 MTA,然后通读消息(这是mutt一个很好的系统邮件阅读器)。

答案2

发生这种情况的原因是您的 cron 作业正在生成输出,然后 cron 守护程序会尝试将该输出通过电子邮件发送给您(即 root)。如果您不需要该输出,最简单的解决方法是在 crontab 中将其丢弃:

sudo crontab -e

并添加>/dev/null 2>&1到每项工作中:

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

答案3

这是一个老问题,但还有一个在某些情况下很有用的额外答案。

通过管道传输 cron 命令的输出,logger以便它们最终出现在系统日志中。

它比安装 postfix 稍微容易一些,它会将此输出与其他日志一起放入 syslog 中。此命令将捕获 stdout 和 stderr,因此您不会看到该No MTA installed消息,并且您会在 syslog 中看到所有输出。

cron 条目示例:

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

您可以使用以下方式查看带有标签的日志mycmd

grep 'mycmd' /var/log/syslog

答案4

如之前的回答所述,发生这种情况是因为您的 cron 作业正在生成输出,然后 cron 守护程序会尝试将该输出通过电子邮件发送给您。如果您不想(或无法)安装 MTA,但想要查看输出,您可以将 cron 作业的输出重定向到日志文件。使用以下命令编辑您的 crontab 文件

crontab -e

sudo如果问题出在 root 的 crontab 上,请使用)并 在每个命令后添加,如下所示:>> /some/log/file 2>&1

0 3 * * *命令  >>/一些/日志/文件2>&1

( 将标准输出发送到指定文件,附加到任何现有内容,并将 错误消息发送到同一位置。)>> /some/log/file2>&1

如果一行中有多个命令,以;&或  分隔,&&  则||应该对每个命令执行上述操作,如下所示:

0 3 * * *命令1  >>/一些/日志/文件2>&1;  命令2  >>/一些/日志/文件2>&1

或者对它们进行分组,如下所示:

0 3 * * *命令1命令2  >>/一些/日志/文件2>&1

如果命令行以 结尾&,则将重定向插入到命令之后但在 之前 &。如果有命令被 |(管道)分隔,则简单的解决方案是将它们分组:

0 3 * * * (命令1  |  命令2)>>/一些/日志/文件2>&1

但另请参阅下面最后一段。

如果您想忽略 stdout 并仅捕获 stderr,请使用。将日志文件放在您想要的任何位置 — 您的主目录, 或者即使您确定不需要保留它。> /dev/null 2>> /some/log/file/var/log/tmp

然后查看作业运行后的日志文件。

如果您发现消息交错且混乱,则可能是程序同时写入 stdout 和 stderr,且协调性较差。在这种情况下,请尝试使用 将它们写入单独的文件。您可能需要对管道执行类似操作:>> /some/log/file1  2>> /some/log/file2

0 3 * * *命令1  2>>/一些/日志/文件cmd1err  |  命令2  >>/一些/日志/文件cmd22>&1

(对于用 . 分隔的命令,最好使用单独的文件 &

相关内容