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

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

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

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

答案1

检查您使用 cron 运行的程序是否有自己的日志文件。如果没有,但会将其输出写入标准输出,您可以将这些输出重定向到文件或将其邮寄给您。在 crontabs 中标准 shell 重定向作品。

例如,要将 的错误输出重定向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

或者邮寄给您(如果mail可用)

 33 3 * * * /path/to/some_job.sh 1> /dev/null 2>&1 | mail -s "cron output" [email protected]

答案2

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

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

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

答案3

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

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

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

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

答案4

最简单的方法是捕获错误消息并将其保存在文件中。我有一个cron调用php命令行的作业,如下所示:

1 0 * * * php /pathOfMyApp/index.php controllerName functionName > /pathOfMyApp/log/myErrorLog 2>&1

之前的部分>是我的cron工作,之后的>部分是捕获并保存在位于我项目根目录的日志文件夹中的文件中,但可以是您想要的任何地方。注意:每次cron运行作业时,它都会覆盖上一个日志文件。您可以使用>>它附加到现有文件的末尾。

如果您的 crontab 使用curlwget并引用链接,您可以搜索/var/log/httpd/appNameaccess-log,如果 cron 返回 500 或 400,则一定是出了问题。

作为最后的手段,您/var/log/messages也可以检查一下。

相关内容