我有一个带有“printf”的 cron 任务:
#!/bin/bash
# ..........
printf "hello\n"
# ..........
它每 N 小时运行一次。但是,/var/log/syslog
我根本看不到任何带有“hello”的日志。为什么呢?
答案1
cron 的设计者假设 cron 用户会适当地引导输出(stdout 和 stderr),因此,任何未重定向到文件或其他进程的输出都可能是一个错误。
他们选择通过 sendmail 将所有虚假(即未重定向)的输出转发给 cron 作业的所有者。
如果你检查 /var/log/syslog,你应该会发现类似这样的条目:
Jun 26 22:18:01 sys0af3e3 CRON[16529]: (CRON) info (No MTA installed, discarding output)
cron 通常调用的程序是 /usr/sbin/sendmail,但您可以通过运行以下命令来验证您的实现中使用了哪个程序:
strings /usr/sbin/cron | grep -i '^/.*mail'
如果您要创建 /usr/sbin/sendmail(它应该是可执行的),其内容如下:
echo "####################" >> /tmp/mail.out 2>&1
date >> /tmp/mail.out 2>&1
cat >> /tmp/mail.out 2>&1
然后运行:
systemctl restart cron #this must be run as root
每次运行后,您都会发现丢失的输出附加到文件 /tmp/mail.out 中。
完成测试后,请不要忘记删除 /usr/bin/sendmail 并重新启动 cron。