如何查看我的Cron工作结果?


Answers:


66

检查您使用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" you@example.org

这就是我一直解决我的cron问题的方式。
PhysicalMichael

第二个例子对吗?它不会将所有内容重定向到/dev/null吗?
Timmmm 2012年

7
@Timmmm:我确实在工作。它首先将所有内容从some_job.sh的stdout 重定向到stder,/dev/null然后再重定向到stdout(现在不再包含自身)。这样,只有其stderr会以stdout结尾并传递给mail
本杰明·班尼尔

9

我使用过的平台上的大多数cron守护程序会自动将用户cron作业的stdout / stderr通过电子邮件发送给该作业的crontab用户。我忘了整个系统会发生什么(来自/ etc / crontab的非用户特定的cron作业)。问题是人们不再总是在大多数类似Unix的OS上设置邮件程序守护程序(即sendmail,qmail或postfix之类的邮件传输代理(MTA))。因此,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”。


3
这是对的。可以使用mail命令从命令行读取消息。或看看/var/spool/mail。但是,如果您安装了postfix或除标准sendmail以外的其他邮件程序,则需要另一种读取消息的方法。
akostadinov

为什么我们为此需要邮件服务代理?mail -s "cron output" test@example.com效果很好:/
Martin Konecny

在CentOS上,我的cron输出被“邮寄”到/ var / spool / mail。less $MAIL如果要查看当前用户的cron输出,或者less /var/spool/mail/root要查看以root身份运行的命令的cron输出,请通过运行查看它。
sffc


2

最简单的方法是捕获打印错误,然后将其保存到文件中。我有一个cronjob,它调用php命令行,如下所示:

1 0 * * * php /pathOfMyApp/index.php controllerName函数名称> / pathOfMyApp / log / myErrorLog 2>&1

'>'之前的部分是我的cronjob,而'>'之后的部分是捕获并保存在项目根目录中的日志文件夹中的文件中,但是可以放在所需的位置。注意:每次调用cronjob时,他都会覆盖上一个日志。您可以使用“ >>”在现有文件的末尾写入或搜索“ cat”终端命令。

如果crontab使用'curl'或'wget'并引用了链接,则可以在/ var / log / httpd / appName中搜索访问日志,如果cron返回500或400一定是错误的。

最后,您也可以检查/ var / log / messages。


1

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

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

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

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


1

我更喜欢获得有关cron作业的电子邮件报告。刚放

MAILTO=yourmail@domain.com

进入crontab,您将收到一封电子邮件。当然,您必须为您的帐户配置电子邮件。


我发现这通常是打开和关闭调试的最简单方法。我通常只使用username @ localhost作为电子邮件地址。
flickerfly 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.