如何记录cron作业?

我想知道如何在每次执行时准确地看到cron作业正在做什么。日志文件位于哪里?或者我可以把输出发送到我的邮箱吗?我已经设置了电子邮件地址,当cron作业运行时发送日志,但我还没有收到任何东西。

365964 次浏览
* * * * * myjob.sh >> /var/log/myjob.log 2>&1

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

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

默认cron日志到/var/log/syslog,这样你就可以看到cron相关的条目:

grep CRON /var/log/syslog

https://askubuntu.com/questions/56683/where-is-the-cron-crontab-log < a href = " https://askubuntu.com/questions/56683/where-is-the-cron-crontab-log " > < / >

这是我的代码:

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

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

  1. 程序执行前的日志记录 cronjob试图执行命令。这个位于 /var/log/syslog,正如@Matthew Lock已经提到的

  2. 程序尝试执行后的错误日志,可以发送到 如@Spliffster所提到的,通过电子邮件或文件发送。我更喜欢日志记录 因为有了电子邮件,你就有了一个新的来源 问题,以及检查电子邮件发送和接收是否正常工作 完美。有时是,有时不是。例如,在一个 简单的普通桌面机,你不感兴趣 配置smtp,有时你会更喜欢日志文件:

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

$locate python

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

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

如果你用sudo运行一些命令,它将不允许。须藤需要洗漱。

在Ubuntu上,你可以让cron.log文件只包含CRON条目。

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

#  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.logsyslog中搜索它,创建一个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/

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

你可以在crontab文件中使用MAILTO=recipient将电子邮件发送到不同的帐户。

要使其工作,您需要使邮件正常工作。发送到本地邮箱通常不是问题(事实上,ls -l "$MAIL"很有可能会显示你已经收到了一些),但要将它从盒子里拿出来放到互联网上,需要正确配置MTA (Postfix, Sendmail,等等)以连接到世界。

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

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

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

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

注意我们如何使用append (double >>)而不是override,这样任何前一个作业的输出都不会被下一个作业的输出所取代。

正如这里的许多回答所建议的,您可以将两个输出流发送到单个文件;用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。还要注意错误消息如何包含产生诊断消息的脚本名称。

如果你仍然想检查你的cron作业,你应该提供一个有效的 在cPanel中设置Cron作业时使用email帐户

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

请记住,每个执行的cron作业都会收到一封电子邮件。这可能会淹没你的收件箱,以防你的crons运行太频繁

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

* * * * * /path/file.sh > /pathToKeepLogs/logFileName.log 2>&1

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