我看过很多关于如何运行 crontab 的指南,但我现在需要的是学习如何
- 查找有关 cron 作业的日志文件
- 配置记录的内容
答案1
检查您使用 cron 运行的程序是否有自己的日志文件。如果没有,但会将其输出写入标准输出,您可以将这些输出重定向到文件或将其邮寄给您。在 crontabs 中标准 shell 重定向作品。
例如,要将 的错误输出重定向some_job.sh
到some_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 使用curl
或wget
并引用链接,您可以搜索/var/log/httpd/appName
access-log,如果 cron 返回 500 或 400,则一定是出了问题。
作为最后的手段,您/var/log/messages
也可以检查一下。