问题描述
我有一个全新的Ubuntu 12.04.1 LTS安装了许多服务器。
我没有在这些服务器上添加任何cron作业或编辑我的crontab,但是,在每台机器的大约同一时间,我会在秒杀时获得75%的CPU峰值以及我的系统日志中的以下信息:
CRON[8380]: (CRON) info (No MTA installed, discarding output)
我安装了mono-complete,并且正在运行服务堆栈web服务器。
对我来说,阻止这种事情发生的最好办法是什么?我希望能够删除CPU峰值。
最佳解决方法
Linux使用邮件向用户发送通知。大多数Linux发行版都安装了邮件服务(包括MTA)。 Ubuntu虽然没有。
你可以安装一个邮件服务,例如postfix来解决这个问题。
sudo apt-get install postfix
或者你可以忽略它。我认为cron无法发送消息与CPU峰值无关(这与cron运行的基础作业有关)。安装MTA并读取消息(mutt
是一个很好的系统邮件阅读器)可能是最安全的。
次佳解决方法
发生这种情况是因为您的cron作业正在生成输出,然后cron守护程序会尝试将该输出发送给您(即root)。如果你不需要这个输出,解决这个问题的最简单的方法就是在crontab中放弃它:
sudo crontab -e
并将>/dev/null 2>&1
添加到每个作业:
* * * * * yourCommand >/dev/null 2>&1
第三种解决方法
就我而言,该消息暗示着bash脚本存在权限问题,但直到我安装了MTA后才能看到它。
正如建议我跑了:
sudo aptitude install postfix
我在安装过程中和再次运行cron作业后选择了”Local”:
sudo tail -f /var/mail/<user>
在我的情况下,我换了
<user>
与”root”。
然后我可以看到与权限相关的错误输出。
第四种方法
在crontab中添加这个作为第一行:
MAILTO=""
这将防止cron尝试发送e-mail。
第五种方法
如果您不想安装MTA(目前我不需要),则可以将cron作业的结果传输到日志文件。
sudo crontab -e
那么你的cron工作就像这样。
0 3 * * * /cmd/to/run >> /var/log/somelogfile.log
那么你可以尾巴日志,看看发生了什么
sudo tail -f -n 50 /var/log/somelogfile.log
这是我在任何服务器上所做的,我在syslog中看到该消息
第六种方法
正如在前面的回答中所述,发生这种情况是因为您的cron作业正在生成输出,然后cron守护进程会尝试将该输出通过电子邮件发送给您。如果您不想(或不能)安装MTA,但希望查看输出,则可以将cron作业的输出重定向到日志文件。使用编辑您的crontab文件
crontab -e
(如果问题出在root的crontab上,则使用sudo
),并在每个命令之后添加>> /some/log/file 2>&1
,如下所示:
0 3 * * * cmd >> /some/log/file 2>&1
如果一行上有多个命令,用;
,&&
或||
分隔,则应对每个命令执行上述操作,如下所示:
0 3 * * * cmd1 >> /some/log/file 2>&1; cmd2 >> /some/log/file 2>&1
或者将它们分组,如下所示:
0 3 * * * (cmd1; cmd2) >> /some/log/file 2>&1
如果您想忽略标准输出并只捕获标准错误,请改为使用> /dev/null 2>> /some/log/file
。把日志文件放在任何你想要的地方 – 你的主目录,/var/log
,或者甚至/tmp
,如果你确定你不需要保留它的话。
然后在作业运行后查看日志文件。
第七种方法
将/dev/null 2>&1
添加到cron作业命令的一个副作用是放弃STDERR
和STDOUT
(标准错误以及输出)。如果您不想从cron发送任何电子邮件,这可以正常工作。但是,如果您希望将错误通过电子邮件发送给您,请改为使用>/dev/null
。 Read this blog post for more explanation。
您仍需要安装MTA(邮件传输代理)才能发送错误电子邮件。 Postfix很简单,可以安装:sudo apt-get install postfix
第八种方法
这是一个古老的问题,但有一个额外的答案在某些情况下很有用。
通过logger
管道将cron命令的输出传送到syslog中。
它比安装postfix稍微简单一些,它会将此输出与其他日志一起放入syslog中。该命令将捕获stdout和stderr,因此您将看不到No MTA installed
消息,并且您将在系统日志中看到所有输出。
示例cron条目:
0 3 * * * (cmd1; cmd2) 2>&1 | logger -t mycmd
您可以使用您的标签mycmd
查看日志:
grep 'mycmd' /var/log/syslog