在上一篇文章使用 mailx/mail 命令通过外部 SMTP 服务器发送邮件中,介绍了 mailx 安装和配置。接下来想要达到的效果是:不用在每个定时任务中分别写入邮件发送命令,而是将任务中的标准输出由 Cron 统一经由 mailx 发送出去。
默认情况下,Cron 执行任务列表中的定时任务时,如果任务有标准输出(
stdout
),则会通过本地的 MTA (如 Sendmail、Postfix) 将输出信息发送到用户的本地邮箱(/var/spool/mail/user
或者/var/mail/user
),例如/etc/crontab
文件中默认定义了MAILTO=root
。
一、配置
1.1 添加 Crond 的启动参数
$ sudo vi /etc/sysconfig/crond
在 CRONDARGS=
后面写入 -m "mailx -t"
:
# Settings for the CRON daemon.
# CRONDARGS= : any extra command-line startup arguments for crond
CRONDARGS=-m "mailx -t"
这里添加的内容会追加到 Crond 的启动命令中去。-m
选项定义了如果不用默认的本地 MTA(例如 Sendmail)发送邮件,用什么命令代替,这里当时是用 mailx 代替。而之所以会在 mailx 命令后面出现 -t
选项,是因为 Crond 输出的是一个完整格式化的带有标头的邮件信息,mailx 命令的 -t
选项正是用来接收此类信息的。
修改后重启 Crond 服务
$ sudo systemctl restart crond.service
$ # 在查看服务状态的输出中就能看到 Crond 的启动命令已经发生了变化
$ sudo systemctl status crond.service -l
1.2 修改 Cron 的环境变量
打开任务列表文件:
$ sudo vi /etc/crontab
修改 MAILTO
并添加 MAILFROM
环境参数:
MAILTO=目标邮箱
MAILFROM=163邮箱
# 如果出现乱码问题可以添加下面这一行
# CONTENT_TYPE=text/plain; charset=utf-8
MAILTO
定义的是信息发往哪个邮箱。MAILFROM
定义的是 mailx 配置的邮箱账户。
二、测试
配置完毕后添加一个定时任务进行测试:
* * * * * root echo "你好"
保存退出,正常情况每分钟都会收到一封邮件。如果没有收到,可以通过下面的命令查看 Cron 运行的信息:
$ sudo systemctl status crond.service -l
或者查看 Cron 日志文件:
$ sudo vi /var/log/cron
(完)