我全新安装了 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是一个很好的系统邮件阅读器)。
小智 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)
小智 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)
与“根”。
然后我能够看到与权限相关的错误输出。
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 尝试发送电子邮件。
小智 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)
小智 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 中看到该消息的任何服务器上所做的
pan*_*kka 11
添加/dev/null 2>&1到 cron 作业命令的一个副作用是它将丢弃STDERR和STDOUT(标准错误以及输出)。如果您不想要来自 cron 的任何电子邮件,这可以正常工作。但是,如果您希望将错误通过电子邮件发送给您,请>/dev/null改用。阅读这篇博文以获得更多解释。
不过,您仍然需要安装 MTA(邮件传输代理)才能发送错误电子邮件。Postfix 很简单,可以安装:sudo apt-get install postfix
小智 5
您可以MAILTO=\xe2\x80\x9d\xe2\x80\x9d在文件的开头设置变量crontab。这也将禁用电子邮件警报。编辑/打开您的 cron 作业:
$ crontab -e\nRun Code Online (Sandbox Code Playgroud)\n\n在文件顶部输入:
\n\nMAILTO=""\nRun Code Online (Sandbox Code Playgroud)\n\nhttps://www.cyberciti.biz/faq/disable-the-mail-alert-by-crontab-command/
\n| 归档时间: |
|
| 查看次数: |
466326 次 |
| 最近记录: |