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

sun*_*ant 273 cron

我全新安装了 Ubuntu 12.04.1 LTS 和许多服务器。

我没有在这些服务器上添加任何 cron 作业或编辑我的 crontab,但是,大约在同一时间,对于每台机器,我得到 75% 的 CPU 尖峰,并且在尖峰时我的 syslog 中出现以下信息:

CRON[8380]: (CRON) info (No MTA installed, discarding output)
Run Code Online (Sandbox Code Playgroud)

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

我阻止这种情况发生的最佳方法是什么?我希望能够消除 CPU 尖峰。

小智 219

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

您可以安装一个邮件服务,例如 postfix,来解决这个问题。

sudo apt-get install postfix
Run Code Online (Sandbox Code Playgroud)

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

  • 安装 postfix 是好事吗?哪个 MTA 最容易使用? (8认同)
  • 值得指出的是,在安装过程中与 cron 一起使用(也就是说,如果您不想实际向外发送电子邮件),您应该回答配置为仅供本地使用。 (8认同)
  • postfix 是 linux 使用最广泛的邮件服务器,坚持使用 (4认同)
  • 我知道检查邮件的唯一方法是“mailutils”(debian)提供的“mail”,postfix 是否有更好的内置方法? (2认同)
  • postfix 是否实际上并不通过互联网发送电子邮件,而是创建一个可以从命令行检查的本地邮箱?很高兴提及这一点。(是的,使用这个答案在我的其他服务器上进行验证:https://serverfault.com/a/100743) (2认同)

小智 114

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

sudo crontab -e
Run Code Online (Sandbox Code Playgroud)

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

* * * * * yourCommand >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的问题在于它不能解释高 CPU 使用率。Cron 显然试图进行交流,而这实际上只是忽略了输出。我更倾向于处理输出而不是丢弃它,以防万一有有用的调试信息。 (14认同)
  • 要保留输出,请将命令放入脚本中,并将 stdout 和 stderr 通过管道传输到 `logger`。例如,`yourCommand >/dev/null 2>&1 | 记录器 -t mycmd`。这会将输出放在 syslog 中以安全保存,并停止 MTA 投诉。 (11认同)
  • 对于阅读 @CivMeierFan 评论的人 - 不要将 `> /dev/null` 放在那里:) 有关更多详细信息,请参阅 Michael Hunter 的答案。 (3认同)
  • @rob :隐藏输出不是解决方法。 (2认同)

小智 80

就我而言,该消息暗示 bash 脚本存在权限问题,但在安装 MTA 之前我看不到它。

按照建议我跑了:

sudo aptitude install postfix
Run Code Online (Sandbox Code Playgroud)

我在设置期间和再次运行 cron 作业后选择了“本地”:

sudo tail -f /var/mail/<user>
Run Code Online (Sandbox Code Playgroud)

就我而言,我替换了

<user>
Run Code Online (Sandbox Code Playgroud)

与“根”。

然后我能够看到与权限相关的错误输出。

  • 感谢您对如何检查邮箱以查看作业错误的额外评论! (7认同)

G-M*_*ca' 60

正如之前的回答中所述,发生这种情况是因为您的 cron 作业正在产生输出,然后 cron 守护进程尝试将该输出通过电子邮件发送给您。如果您不想(或不能)安装 MTA,但希望查看输出,则可以将 cron 作业的输出重定向到日志文件。编辑您的 crontab 文件

crontab -e
Run Code Online (Sandbox Code Playgroud)

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

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

如果一行中有多个命令,用;,? &&? 或者||,您应该对每个命令执行上述操作,如下所示:

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

或将它们分组,如下所示:

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

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

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


88w*_*hed 45

在 crontab 中将此添加为第一行:

MAILTO=""
Run Code Online (Sandbox Code Playgroud)

这将阻止 cron 尝试发送电子邮件。

  • 请勿在`MAILTO=""` 后添加任何评论(`#`),否则将无法使用 (8认同)

小智 39

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

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

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

示例 cron 条目:

0 3 * * * (cmd1;  cmd2) 2>&1 | logger -t mycmd
Run Code Online (Sandbox Code Playgroud)

您可以mycmd使用以下标签查看日志:

grep 'mycmd' /var/log/syslog
Run Code Online (Sandbox Code Playgroud)

  • 这个答案应该被标记为解决方案,因为它通过 Syslog 服务以现代方式准确地解决了问题。 (6认同)
  • 这对我来说非常有效。日志可通过“journalctl”获得。 (3认同)
  • 完美的答案。 (3认同)

小智 28

如果您不想安装 MTA(我目前不需要),您可以将 cron 作业的结果通过管道传输到日志文件。

sudo crontab -e
Run Code Online (Sandbox Code Playgroud)

然后你的 cron 工作看起来像这样。

0 3 * * * /cmd/to/run >> /var/log/somelogfile.log
Run Code Online (Sandbox Code Playgroud)

然后你可以拖尾日志看看发生了什么

sudo tail -f -n 50 /var/log/somelogfile.log
Run Code Online (Sandbox Code Playgroud)

这是我在 syslog 中看到该消息的任何服务器上所做的

  • 您需要在行尾使用 '2&gt;&amp;1' 将输出到 stderr 捕获到文件中。 (3认同)

pan*_*kka 11

添加/dev/null 2>&1到 cron 作业命令的一个副作用是它将丢弃STDERRSTDOUT(标准错误以及输出)。如果您不想要来自 cron 的任何电子邮件,这可以正常工作。但是,如果您希望将错误通过电子邮件发送给您,请>/dev/null改用。阅读这篇博文以获得更多解释

不过,您仍然需要安装 MTA(邮件传输代理)才能发送错误电子邮件。Postfix 很简单,可以安装:sudo apt-get install postfix

  • afaik,除了将其发送到电子邮件之外,没有办法记录输出。您可以做的最接近的事情是为本地邮件传递设置 postfix(如果您运行“sudo apt-get install postfix”,它会提示您是否要设置本地传递。虽然这最初看起来很痛苦,但它实际上有效现在好多了 (2认同)

小智 5

您可以MAILTO=\xe2\x80\x9d\xe2\x80\x9d在文件的开头设置变量crontab。这也将禁用电子邮件警报。编辑/打开您的 cron 作业:

\n\n
$ crontab -e\n
Run Code Online (Sandbox Code Playgroud)\n\n

在文件顶部输入:

\n\n
MAILTO=""\n
Run Code Online (Sandbox Code Playgroud)\n\n

https://www.cyberciti.biz/faq/disable-the-mail-alert-by-crontab-command/

\n