如何记录cron作业?

时间:2011-01-27 00:20:55

标签: logging cron

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

9 个答案:

答案 0 :(得分:295)

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

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

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

答案 1 :(得分:55)

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

grep CRON /var/log/syslog

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

答案 2 :(得分:10)

这是我的代码:

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

答案 3 :(得分:10)

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

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

  2. 程序尝试执行后可以发送的错误记录 电子邮件或文件,如@Spliffster所述。我更喜欢伐木 到一个文件,因为有了电子邮件,那么你有一个新的来源 问题,以及检查电子邮件发送和接收是否正常 完美。有时是,有时它不是。例如,在 您不感兴趣的简单通用台式机 配置smtp,有时你会更喜欢记录到文件:

     * * * *  COMMAND_ABSOLUTE_PATH > /ABSOLUTE_PATH_TO_LOG 2>&1
    
    • 我还会考虑检查/ ABSOLUTE_PATH_TO_LOG的权限,并从该用户的权限运行该命令。仅用于验证,同时测试它是否可能是潜在的问题来源。
  3. 程序本身的记录,具有自己的错误处理和记录以进行跟踪。
  4. cronjobs存在一些常见问题:  *要执行的二进制文件的ABSOLUTE PATH。当你从你的运行它    shell,它可能会工作,但cron进程似乎使用另一个    环境,因此如果你不这样做,它总是找不到二进制文件    使用绝对路径。    *二进制文件使用的库。它或多或少与前一点相同,但要确保,如果只是简单地输入命令的名称,则指的是使用相同库的二进制文件,或者更好,检查您引用的二进制文件绝对路径与您直接使用控制台时引用的路径非常相似。可以使用locate命令找到二进制文件,例如:

    $locate python
    

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

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

答案 4 :(得分:5)

在Ubuntu上,您可以启用<div id="everything"> <h1>hello</h1> <div id="something"> <h1>goodbye</h1> </div> </div>文件以仅包含CRON条目。

取消注释cron.log文件中提及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

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

sudo systemctl restart rsyslog

示例输出:

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内实际运行哪些脚本的更多信息,除非这些脚本将输出定向到cron.log(或者可能是某些其他日志文件)。

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

syslog

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

答案 5 :(得分:3)

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

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

要使其正常工作,您需要让邮件正常工作。传送到本地邮箱通常不是问题(事实上,ls -l "$MAIL"可能会显示您已经收到了一些信息)但是将其从包装盒中取出并进入互联网需要MTA(Postfix,Sendmail,你有什么要正确配置来连接世界。

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

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

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

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

请注意我们如何追加(加倍>>)而不是覆盖,以便之前的作业输出不会被下一个作业替换。

正如这里的许多答案中所建议的那样,您可以将两个输出流发送到单个文件;用2>&1替换第二个重定向来说&#34;标准错误应该出现在标准输出的任何地方&#34;。 (但我并不特别赞同这种做法。如果你真的没有对标准输出做任何事情,那么主要是有意义的,但可能忽略了一些东西,可能来自你的脚本调用的外部工具。 )

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。另请注意错误消息应如何包含生成诊断消息的脚本的名称。

答案 6 :(得分:1)

如果你用sudo运行一些命令,它就不会允许它。 Sudo需要一个tty。

答案 7 :(得分:0)

  

如果您仍然想检查自己的Cron工作,则应提供有效的   在cPanel中设置Cron作业时使用电子邮件帐户。

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

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

答案 8 :(得分:0)

点击命令 $crontab -e,然后将玉米作业编辑为

          • /path/file.sh > /pathToKeepLo​​gs/logFileName.log 2>&1

这里

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