cron 的联机帮助页说
执行命令时,任何输出被邮寄给 crontab 的所有者(或者发送给 crontab 中的 MAILTO 环境变量中指定的用户,如果存在的话)。还可以使用 -s 选项将任何作业输出发送到 syslog。
我试图理解为什么 cron 守护进程在执行 cron 作业时努力记录输出。在我看来,在工作中使用重定向也可以工作?
“任何输出”是否包括两者
- cron 守护进程执行的作业生成的输出
- 输出生成了 cron 守护进程本身?
如果
“任何输出”只是 cron 守护进程执行的作业生成的输出,而不是 cron 守护进程本身生成的输出,并且
我们只关心输出的内容,而不关心输出将写入哪个文件,
我们可以在 cronab 文件的作业行中指定将作业中命令的输出重定向到任何文件中,而不是使用 cron 的登录/电子邮件功能(例如选项-s
等)吗?
30 18 * * * rm /home/someuser/tmp/* > /home/t/mycron.log 2>&1
谢谢。
答案1
这里的“任何输出”是指“作业中的命令发送到标准输出或标准错误输出的任何内容”。
如果要执行的命令包括将标准输出重定向到文件,则整个命令将不会发出标准输出,因为它将全部重定向到文件。
作业生成的输出被视为拥有该作业的任何用户的财产;由 cron 守护进程本身创建的关于作业执行的日志消息(即执行了什么、何时、在谁的帐户上以及作业的结果代码是什么)被认为是系统管理员的财产。
-s
守护进程“cronie”的选项导致cron
作业输出为还记录到系统日志中,以便系统管理员更轻松地使用。它对于没有正常运行的本地电子邮件服务的系统也可能很有用。
所以,是的,您可以重定向输出。但您通常也应该注意重定向标准错误输出:
30 18 * * * rm /home/someuser/tmp/* > /home/t/mycron.log 2>/home/t/mycron.errors.log
...或者如果您希望在同一个文件中同时提供标准输出和标准错误输出,您可以使用以下简写:
30 18 * * * rm /home/someuser/tmp/* > /home/t/mycron.log 2>&1
(您会发现标准rm
命令通常不会向标准输出输出任何内容,并且任何错误都会进入标准错误输出。这就是为什么有必要捕获两种类型的输出。)