我正在尝试调试 cron 无法在未配置的 Centos 6 机器上发送邮件的问题。我如何确定 cron 使用哪个邮件程序发送邮件?crontab 手册页部分内容如下:
除了 LOGNAME、HOME 和 SHELL 之外,cron(8) 还会查看 MAILTO,看是否有任何理由在“此”crontab 中运行命令后发送邮件。如果定义了 MAILTO(且非空),则会将邮件发送给指定用户。如果定义了 MAILTO 但为空(MAILTO=""),则不会发送邮件。否则,将邮件发送给 crontab 的所有者。 如果您在安装 cron 时决定使用 /bin/mail 而不是 /usr/lib/sendmail 作为邮件程序,则此选项很有用 - /bin/mail 不执行别名,并且 UUCP 通常不会读取其邮件。
带星号的部分让我疑惑“那么,它是 sendmail 还是 mail?”
答案1
通过 Google 快速查找,我发现这/etc/sysconfig/crond
是定义 cron 所用邮件程序的文件。
答案2
根据 cron(8)(实际发送消息的守护进程)的手册页:
-m This option allows you to specify a shell command string to use for
sending cron mail output instead of sendmail(8). This command must
accept a fully formatted mail message (with headers) on stdin and send
it as a mail message to the recipients specified in the mail headers.
这让我相信它默认使用 sendmail。让我们用 strace 来验证一下:
设置一个生成电子邮件的 cron 作业:
user@host1 ~:
$ crontab -e
crontab: installing new crontab
user@host1 ~:
$ crontab -l
[email protected]
*/5 * * * * echo "testing"
现在找到 crond 的进程 ID:
user@host1 ~:
$ ps auxww | grep crond
root 9684 0.0 0.0 117280 1296 ? Ss Jul22 0:17 crond
user 36344 0.0 0.0 103240 884 pts/2 S+ 23:01 0:00 grep crond
使用 strace 附加到 crond 进程,查找与进程相关的活动。当 strace 写入 stderr 时,我将其重定向到 stdout 并 grepped 查找“mail”:
root@host1 ~:
# strace -fp 9684 -s 1024 -e trace=process 2>&1 | grep mail
[pid 36204] execve("/usr/sbin/sendmail", ["/usr/sbin/sendmail", "-FCronDaemon", "-i", "-odi", "-oem", "-oi", "-t", "-f", "root"], [/* 16 vars */]) = 0
^C
是的,它是 sendmail。