我在一些服务器上全新安装了 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/file
2>&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
(对于用 . 分隔的命令,最好使用单独的文件 &
)