CentOS 7 上一台没装 postfix 的机器,cron 任务每五分钟输出一行进度,几个月后 /var/mail/root 长到 8G,df 报警,业务代码一行没改。

这类报错背后常见的原因有几处,逐个排除就行。MAILTO 没设,cron 默认把输出发给当前用户,本地 MTA 把它写成 mbox。也可能是脚本里的 stderr 没重定向,哪怕一句 warning 也生成一封邮件。

不容易想到的是,机器上有 sendmail 但没配转发,邮件全积压在本地队列。

动手时先看是谁在发

ls -lh /var/mail/ && grep -c '^From ' /var/mail/root

随后关掉输出邮件

crontab 首行写 MAILTO="",每行末尾补 >>/var/log/job.log 2>&1

再往下清空已有的 mbox

: > /var/mail/root

需要通知就改成打 webhook

curl -s -X POST -H 'Content-Type: application/json' -d '{"text":"backup done"}' $HOOK

这类问题以前遇到过,但这次的触发条件和上次不一样。

这类改动我都写进变更记录,过两周再出问题时能对上号。

改完先别撤,确认这几项。/var/mail/root 稳定在 0 字节,df 的 /var 使用率回落,任务本身仍在跑且脚本日志里有当天的时间戳。

这里还有个坑。MAILTO 写在 crontab 第一行才全局生效,逐行重定向更保险;清 mbox 用 : > 而不是 rm,否则 postfix 的锁文件会残留。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189