MAILTO只是邮件投递开关而非重定向,不保存日志;可靠输出捕获需显式重定向到绝对路径文件,或用logger写入syslog,并配合logrotate防日志膨胀。

Linux 中 Cron 任务的“邮件输出重定向”其实是个常见误解——MAILTO 不是重定向,而是邮件投递开关;它不保存日志,也不替代文件记录。默认情况下,crond 会把任务的 stdout 和 stderr 尝试发给 MAILTO 指定的用户(如 root),但若系统没配邮件服务(绝大多数生产环境都未启用 sendmail/postfix/ssmtp),这些输出就彻底丢失了。
MAILTO 的真实作用和局限
在 /etc/crontab 或 /etc/cron.d/ 文件开头设置 MAILTO=root,仅表示:当该文件中定义的任务产生输出时,crond 会调用本地 mail 命令尝试投递。它不会写入任何日志文件,也不能检索、归档或告警。一旦邮件服务不可用,输出即消失,且 /var/log/cron 里只记“RUNNING”,不记命令实际输出。
- MAILTO=""(空值)可禁用邮件,但输出仍会丢弃,不是重定向
- MAILTO 配置对用户级
crontab -e无效(用户 crontab 不解析 MAILTO 行) - 依赖邮件做监控=不可靠、难审计、无历史、易漏报
真正可靠的输出捕获方式:显式重定向
必须在 cron 条目中用 > 或 >> 显式重定向 stdout/stderr 到文件,且路径必须为绝对路径,目标目录需有写权限。
-
追加写入(推荐):每行输出追加到底部,保留完整执行历史
*/10 * * * * /opt/scripts/health.sh >> /var/log/health.log 2>&1 -
分开记录:stdout 和 stderr 写入不同文件,便于排查是逻辑错还是执行错
0 2 * * * /backup.sh > /var/log/backup.out 2> /var/log/backup.err -
丢弃输出(静默运行):适合确定无需监控的维护任务
0 3 * * * /usr/bin/logrotate /etc/logrotate.conf > /dev/null 2>&1
进阶替代方案:用 logger 写 syslog
如果希望输出进入 /var/log/messages 或被 journald 收集(方便集中日志系统对接),可在脚本内或 cron 条目中调用 logger:
- 在脚本开头加:
echo "$(date): backup started" | logger -t backup-job - 直接在 cron 中写:
0 4 * * * /opt/scripts/cleanup.sh 2>&1 | logger -t cleanup-cron - 好处:自动打时间戳、带标签、兼容 logrotate 和 ELK/Splunk 等工具
别忘了配套管理日志文件
重定向到文件后,需防止单个日志无限增长:
- 用 logrotate 自动轮转(推荐):配置 /etc/logrotate.d/your-cron-log
- 在脚本末尾清理旧日志:
find /var/log -name "health.log" -mtime +30 -delete - 避免用
>覆盖写,除非你明确只要最新一次结果


















