为什么 cron 守护进程在执行 cron 作业时努力记录输出,而不是在作业内使用重定向?

为什么 cron 守护进程在执行 cron 作业时努力记录输出,而不是在作业内使用重定向?

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命令通常不会向标准输出输出任何内容,并且任何错误都会进入标准错误输出。这就是为什么有必要捕获两种类型的输出。)

相关内容