如何记录Cron作业?


218

我想知道我如何才能准确地看到cron作业在每次执行时的工作。日志文件在哪里?还是可以将输出发送到我的电子邮件?我已设置电子邮件地址,以在cron作业运行时发送日志,但是我还没有收到任何信息。


Answers:


347
* * * * * myjob.sh >> /var/log/myjob.log 2>&1

会将cron作业的所有输出记录到/var/log/myjob.log

您可能会mail用来发送电子邮件。大多数系统会cron通过电子邮件将未处理的作业输出发送给root或相应的用户。



5
如果从未创建此日志文件,可能是什么问题?
夹紧

10
FWIW,如果你想同时stderrstdout在日志中,2>&1有来的间接之后:myjob.sh >> /var/log/myjob.log 2>&1
丹·勒科克

2
如何在YYYY-MM-DD_hh-mm-sec输出文件名中插入文件,以使每个文件名都不同并且保持不变而无需重写?
Danijel

6
@Danijel serverfault.com/a/117365/193377 0 0 * * * /some/path/to/a/file.php> $ HOME / date +\%Y\%m\%d\%H\%M\%S-cron.log 2>&1
AnneTheAgile

61

默认情况下,cron日志记录到/ var / log / syslog,因此您可以使用以下命令查看与cron相关的条目:

grep CRON /var/log/syslog

/ubuntu/56683/where-is-the-cron-crontab-log


2
在ubuntu 12.04上,默认没有.log,即/ var / log / syslog
tishma 2014年

5
journalctl | grep cron在系统系统上使用
Microsoft Linux TM

2
/var/log/cron在AWS Linux AMI上
乔纳森

2
sudo journalctl -u cron
Gianfranco P.

2
确切cron记录的位置非常依赖系统。有一个单独的答案,其中包含有关如何在Linux系统(或更正确地说,是使用的系统syslog)上配置各种日志记录目标的详细信息。其他系统可能有不同的方式来配置这些东西。
Tripleee

10

这是我的代码:

* * * * * your_script_fullpath >> your_log_path 2>&1

“ >>”表示将数据附加到文件权限?“ 2>&1”,有错误的完整输出是什么意思,对吗?
Nullpointer

3
基本重定向问题最好在手册中进行检查。在堆栈溢出上,也存在关于这些运算符的重复问题的度量标准。但是是的,大致而言;>>追加并2>&1说将标准错误发送到与标准输出相同的位置。
三点

10

至少有三种不同类型的日志记录:

  1. 程序执行之前的日志记录,仅当cronjob TRIED执行命令时才记录日志。如@Matthew Lock所述,该文件位于/ var / log / syslog中。

  2. 程序尝试执行后记录错误,如@Spliffster所述,可以将其记录到电子邮件或文件中。我更喜欢登录到文件,因为使用电子邮件,那么您就有了一个新的问题源,并且可以检查电子邮件的发送和接收是否工作正常。有时是,有时不是。例如,在您对配置SMTP不感兴趣的简单普通台式机中,有时您会更喜欢登录到文件:

     * * * *  COMMAND_ABSOLUTE_PATH > /ABSOLUTE_PATH_TO_LOG 2>&1
    
    • 我还将考虑检查/ ABSOLUTE_PATH_TO_LOG的权限,然后从该用户的权限运行命令。仅用于验证,同时您测试它是否可能是潜在的问题根源。
  3. 程序本身的日志记录,带有自己的错误处理和跟踪记录。

cronjobs有一些常见的问题根源:*要执行的二进制文件的绝对路径。从外壳运行它时,它可能会起作用,但是cron进程似乎使用了另一个环境,因此,如果不使用绝对路径,它并不总是会找到二进制文件。*二进制文件使用的LIBRARIES。它与上一点大致相同,但是请确保(如果仅放置命令的名称)是指使用完全相同的库的二进制文件,或者更好,请检查您使用绝对路径引用的二进制文件与您直接使用控制台时所指的相同。可以使用locate命令找到二进制文件,例如:

$locate python

确保您要引用的二进制文件与您在外壳程序中调用的二进制文件完全相同,或者使用计划放入cronjob中的绝对路径在外壳程序中再次进行测试。

  • 问题的另一个常见来源是cronjob中的语法。请记住,有一些特殊字符可用于列表(逗号),定义范围(破折号-),定义范围的增量(斜杠)等。看一下:http : //www.softpanorama.org/Utilities/ cron.shtml

8

在Ubuntu上,您可以启用一个cron.log文件,使其仅包含CRON条目。

取消对中提到行cron/etc/rsyslog.d/50-default.conf文件:

#  Default rules for rsyslog.
#

#                       For more information see rsyslog.conf(5) and /etc/rsyslog.conf

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                          /var/log/cron.log

保存并关闭文件,然后重新启动rsyslog服务:

sudo systemctl restart rsyslog

现在,您可以在自己的文件中看到cron日志条目:

sudo tail -f /var/log/cron.log

样本输出:

Jul 18 07:05:01 machine-host-name CRON[13638]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)

但是,您将不会看到有关在/etc/cron.daily或中实际运行了哪些脚本的更多信息/etc/cron.hourly,除非这些脚本将输出定向到cron.log(或其他一些日志文件)。

如果要验证crontab是否正在运行并且不必在cron.log或中搜索它syslog,请创建一个crontab,以将输出重定向到您选择的日志文件-类似:

# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log 2>&1

步骤来自:https : //www.cyberciti.biz/faq/howto-create-cron-log-file-to-log-crontab-logs-in-ubuntu-linux/


Ubuntu 16.04没有显示任何cron日志,该信息可以解决问题。
pojda

5

cron 已经通过邮件将其运行的每个作业的标准输出和标准错误发送给cron作业的所有者。

您可以MAILTO=recipientcrontab文件中使用,以将电子邮件发送到其他帐户。

为此,您需要使邮件正常工作。传递到本地邮箱通常不是问题(事实上,很可能ls -l "$MAIL"会发现您已经收到了一些邮件),但要立即使用它并上网,则需要MTA(Postfix,Sendmail,您拥有什么)才能正确配置以连接世界。

如果没有输出,将不会生成电子邮件。

常见的安排是将输出重定向到文件,在这种情况下,cron守护程序当然不会看到作业返回任何输出。一种变体是将标准输出重定向到文件(或编写脚本,以便它从不打印任何内容-也许将结果存储在数据库中,或者执行维护任务而根本不输出任何内容?),并且仅在存在时接收电子邮件是错误消息。

要重定向两个输出流,语法为

42 17 * * * script >>stdout.log 2>>stderr.log

请注意,我们如何附加(double >>)而不是覆盖,因此上一个作业的输出不会被下一个作业的输出取代。

正如此处许多答案所建议的那样,您可以将两个输出流都发送到一个文件中。替换为第二个重定向,2>&1并说“标准错误应该在标准输出所处的任何地方”。(但是我并不特别赞成这种做法。如果您对标准输出不抱有任何期望,但是可能已经忽略了某些东西,也许是来自脚本调用的外部工具,这在很大程度上是有意义的。)

cron作业在您的主目录中运行,因此任何相对文件名都应与此相对。如果要在主目录之外进行写操作,显然需要单独确保对目标文件具有写权限。

常见的反模式是将所有内容重定向到/dev/null(然后让Stack Overflow帮助您找出在某些情况下无法解决问题的原因;但是我们也看不到丢失的输出!)

在脚本中,请确保将常规输出(实际结果,理想情况下以机器可读的形式)和诊断(通常为人类阅读器格式化)分开。在Shell脚本中,

echo "$results"  # regular results go to stdout
echo "$0: something went wrong" >&2

某些平台(例如GNU Awk)允许您使用文件名/dev/stderr来显示错误消息,但这不是可移植的。在Perl中,warndie打印到标准错误;在Python中,写入sys.stderr或使用logging; 在Ruby中,尝试$stderr.puts。还请注意,错误消息应如何包括产生诊断消息的脚本的名称。


1

如果您正在使用sudo运行某些命令,则不允许这样做。Sudo需要一个tty。


4
这也取决于sudo配置。无需输入密码即可运行的事物应NOPASSWD:在您的sudoers配置中进行配置。
重奏

0

如果您仍要检查cron作业,则在cPanel中设置Cron作业时应提供一个有效的电子邮件帐户。

当您指定有效的电子邮件时,您将收到执行的cron作业的输出。因此,您将能够对其进行检查并确保一切都已正确执行。请注意,如果cron job命令没有输出,您将不会收到电子邮件。

请记住,您将收到有关每个已执行的cron作业的电子邮件。万一您的任务太频繁地运行,这可能会使您的收件箱泛滥

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.