如何查看我的 cron 作业的结果?

Zom*_*ies 85 linux cron ubuntu

我看到很多关于如何运行 crontab 的指南,但我现在需要的是学习如何

  1. 查找有关 cron 作业的日志文件
  2. 配置记录的内容

Ben*_*ier 81

检查您使用 cron 运行的程序是否有自己的日志文件。如果他们不将他们的输出写入标准输出,您可以将它们重定向到文件或邮寄给您。在 crontabs标准外壳重定向工作。

例如,重定向的错误输出some_job.shsome_job.err并丢弃标准输出(即发送它/dev/null)以下的重定向添加到您的crontab

 33 3 * * * /path/to/some_job.sh 1> /dev/null 2> /other/path/to/some_job.err
Run Code Online (Sandbox Code Playgroud)

或改为邮寄给您(如果mail有)

 33 3 * * * /path/to/some_job.sh 1> /dev/null 2>&1 | mail -s "cron output" you@example.org
Run Code Online (Sandbox Code Playgroud)

  • @Timmmm:我确实工作。它首先将所有内容从 `some_job.sh` 的 stdout 重定向到 `/dev/null`,并且仅在它的 stderr 之后重定向到 stdout(现在它本身不再包含任何内容)。这样,只有它的 stderr 会在 stdout 中结束并被传递给 `mail`。 (8认同)

Spi*_*iff 10

我使用过的平台上的大多数 cron 守护程序会自动将用户 cron 作业的 stdout/stderr 通过电子邮件发送给作业来自其 crontab 的用户。我忘记了系统范围内(来自 /etc/crontab 的非用户特定的 cron 作业)会发生什么。问题是人们不再总是在大多数类 Unix 操作系统上设置邮件程序守护程序(即邮件传输代理 (MTA),如 sendmail、qmail 或 postfix)。因此,如果 cron 作业输出电子邮件到达那么远,它们就会死在某个地方的本地邮件假脱机文件夹中。因此,一个答案可能只是启动您的邮件程序守护进程,并确保您有一个 ~/.forward 文件将您的本地邮件转发到您的“真实”电子邮件帐户。

如果您希望您的作业写入特定的日志文件,您可以使用@honk 建议的标准输出重定向,或者,假设您的 cron 作业是一个 shell 脚本,您可以让您的脚本调用 logger(1) 或 syslog(1) 或您的操作系统提供的用于向 syslog 发送任意消息的任何其他命令行工具。然后,您可以使用操作系统的内置方法来配置在何处记录哪些类型的消息,也许是通过编辑 /etc/syslog.conf。

我的大部分 cron 作业都会调用我专门编写的 bash 脚本,目的是为了特定原因由 cron 启动。在那些中,尤其是当我最初编写和调试它们时,我喜欢使用 bash 的“set -vx”来使 shell 脚本的每一行的未扩展和扩展形式在执行之前写入 stdout。请注意,从 cron 启动的 shell 脚本被视为非登录、非交互式 shell,因此您的标准 shell 启动脚本(如 .bashrc 和 .profile)不会运行。如果您使用 bash 并希望 bash 运行启动脚本,则必须在您的 crontab 中定义作业的行之前定义一个环境变量“BASH_ENV=/path/to/my/startup/script”。

  • 这是对的。可以使用 `mail` 命令从命令行读取消息。或者查看`/var/spool/mail`。但是,如果您安装了 postfix 或其他邮件程序而不是标准的 sendmail,则需要另一种方式来阅读邮件。 (3认同)

use*_*558 6

我认为在这种情况下,在 cron 文件内重定向可能不是最佳选择。

通常您希望日志记录规范与 cron 作业脚本位于同一位置。在这种情况下,我建议如下:

#!/bin/bash
exec &>> capture-log.txt
echo "Running cron-job foo at $(date)"
...
<rest of script>
Run Code Online (Sandbox Code Playgroud)

这会将 cron 作业的输出附加到 capture-log.txt 文件。


cee*_*yoz 5

cron 正在执行的任务负责它们自己的日志记录。