如何记录cron作业?

Adr*_* M. 202 cron logging

我想知道如何确切地看到cron作业在每次执行时都在做什么.日志文件位于何处?或者我可以将输出发送到我的电子邮件吗?我已经设置了电子邮件地址,以便在cron作业运行时发送日志,但我还没有收到任何信息.

Spl*_*ter 317

* * * * * myjob.sh >> /var/log/myjob.log 2>&1
Run Code Online (Sandbox Code Playgroud)

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

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

  • 什么意思是'2>&1`:http://stackoverflow.com/questions/818255/in-the-bash-shell-what-is-21 (72认同)
  • FWIW,如果你想在日志中同时使用`stderr`和`stdout`,那么`2>&1`必须在间接之后出现:`myjob.sh >> /var/log/myjob.log 2>&1` (9认同)
  • 如果从未创建此日志文件,可能会出现什么问题? (5认同)
  • @Danijel https://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 (4认同)
  • 如何将`YYYY-MM-DD_hh-mm-sec`插入到输出文件名中,以便每个文件名都不同并保持不重写? (2认同)
  • 0 0 * * * /some/path/to/a/file.php > $HOME/\`date +\%Y-\%m-\%d`-cron.log 2>&1 **不要忘记反引号!** 它不会出现在 @AnneTheAgile 和 @sneaky 评论中:D (2认同)

Mat*_*ock 59

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

grep CRON /var/log/syslog
Run Code Online (Sandbox Code Playgroud)

https://askubuntu.com/questions/56683/where-is-the-cron-crontab-log

  • 使用`journalctl | 系统系统上的grep cron` (5认同)
  • 在ubuntu 12.04上,默认没有.log,即/ var/log/syslog (2认同)
  • AWS Linux AMI 上的 `/var/log/cron`。 (2认同)
  • 或`sudo journalctl -u cron` (2认同)
  • 确切记录“ cron”的位置非常依赖于系统。还有一个单独的答案,其中详细说明了如何在Linux系统(或更正确的是使用`syslog`的系统)上配置各种日志记录目标。其他系统可能有不同的方式来配置这些东西。 (2认同)

Hai*_*mei 10

这是我的代码:

* * * * * your_script_fullpath >> your_log_path 2>&1
Run Code Online (Sandbox Code Playgroud)

  • 手册中最好检查基本重定向问题.Stack Overflow上还有关于这些运算符的重复问题的度量标准.但是,粗略地说; `>>`appends和`2>&1`表示将标准错误发送到与标准输出相同的位置. (3认同)

Dav*_*d L 10

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

  1. 执行程序之前的日志记录,只记录cronjob TRIED以执行命令.那个位于/ var/log/syslog中,正如@Matthew Lock已经提到的那样.

  2. 程序试图执行后记录错误,可以发送到电子邮件或文件,如@Spliffster所述.我更喜欢登录到文件,因为有了电子邮件,那么你有一个新的问题来源,并检查电子邮件发送和接收是否完美.有时是,有时不是.例如,在一个简单的常见桌面计算机中,您对配置smtp不感兴趣,有时您更喜欢记录到文件:

     * * * *  COMMAND_ABSOLUTE_PATH > /ABSOLUTE_PATH_TO_LOG 2>&1
    
    Run Code Online (Sandbox Code Playgroud)
    • 我还会考虑检查/ ABSOLUTE_PATH_TO_LOG的权限,并从该用户的权限运行该命令.仅用于验证,同时测试它是否可能是潜在的问题来源.
  3. 记录程序本身,具有自己的错误处理和记录以进行跟踪.

cronjobs存在一些常见问题:*要执行的二进制文件的ABSOLUTE PATH.当你从shell运行它时,它可能会工作,但cron进程似乎使用另一个环境,因此如果你不使用绝对路径它并不总是找到二进制文件.*二进制文件使用的库.它或多或少与前一点相同,但要确保,如果只是简单地输入命令的名称,就是指使用相同库的二进制文件,或者更好,检查您使用绝对路径引用的二进制文件与您直接使用控制台时引用的内容完全相同.可以使用locate命令找到二进制文件,例如:

$locate python
Run Code Online (Sandbox Code Playgroud)

确保您将引用的二进制文件与您在shell中调用的二进制文件完全相同,或者只是使用您计划放入cronjob的绝对路径在shell中再次测试.


小智 7

使用命令crontab -e,然后将 cron 作业编辑为

* * * * * /path/file.sh > /pathToKeepLogs/logFileName.log 2>&1
Run Code Online (Sandbox Code Playgroud)

这里,2>&1表示标准错误 ( 2>) 被重定向到标准输出 ( ) 指向的同一文件描述符&1


Gia*_* P. 6

在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
Run Code Online (Sandbox Code Playgroud)

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

sudo systemctl restart rsyslog
Run Code Online (Sandbox Code Playgroud)

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

sudo tail -f /var/log/cron.log
Run Code Online (Sandbox Code Playgroud)

样本输出:

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

但是,您将不会看到有关在/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
Run Code Online (Sandbox Code Playgroud)

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

  • Ubuntu 16.04 没有显示任何 cron 日志,这些信息起到了作用。 (2认同)

tri*_*eee 5

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

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

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

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

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

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

42 17 * * * script >>stdout.log 2>>stderr.log
Run Code Online (Sandbox Code Playgroud)

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

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

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

常见的反模式是将所有内容重定向到/dev/null(然后请求Stack Overflow来帮助您确定什么地方不起作用时出了什么问题;但是我们也看不到丢失的输出!)

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

echo "$results"  # regular results go to stdout
echo "$0: something went wrong" >&2
Run Code Online (Sandbox Code Playgroud)

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