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


当前回答

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

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

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

其他回答

这是我的代码:

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

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

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

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

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

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

要使其工作,您需要使邮件正常工作。发送到本地邮箱通常不是问题(事实上,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中,警告和打印标准错误;在Python中,写入sys。Stderr,或者使用日志记录;在Ruby中,尝试$stderr.puts。还要注意错误消息如何包含产生诊断消息的脚本名称。

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

The logging BEFORE the program is executed, which only logs IF the cronjob TRIED to execute the command. That one is located in /var/log/syslog, as already mentioned by @Matthew Lock. The logging of errors AFTER the program tried to execute, which can be sent to an email or to a file, as mentioned by @Spliffster. I prefer logging to a file, because with email THEN you have a NEW source of problems, and its checking if email sending and reception is working perfectly. Sometimes it is, sometimes it's not. For example, in a simple common desktop machine in which you are not interested in configuring an smtp, sometimes you will prefer logging to a file: * * * * COMMAND_ABSOLUTE_PATH > /ABSOLUTE_PATH_TO_LOG 2>&1 I would also consider checking the permissions of /ABSOLUTE_PATH_TO_LOG, and run the command from that user's permissions. Just for verification, while you test whether it might be a potential source of problems. The logging of the program itself, with its own error-handling and logging for tracking purposes.

There are some common sources of problems with cronjobs: * The ABSOLUTE PATH of the binary to be executed. When you run it from your shell, it might work, but the cron process seems to use another environment, and hence it doesn't always find binaries if you don't use the absolute path. * The LIBRARIES used by a binary. It's more or less the same previous point, but make sure that, if simply putting the NAME of the command, is referring to exactly the binary which uses the very same library, or better, check if the binary you are referring with the absolute path is the very same you refer when you use the console directly. The binaries can be found using the locate command, for example:

$locate python

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

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

在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.每小时一次,除非这些脚本将输出直接输出到cron.log(或者其他一些日志文件)。

如果你想验证crontab是否正在运行,而不需要在crontab .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/