我想知道如何才能准确地看到每次执行时 cron 作业都在做什么。日志文件位于何处?或者我可以将输出发送到我的电子邮件吗?我已经设置了在 cron 作业运行时发送日志的电子邮件地址,但我还没有收到任何东西。
* * * * * 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
journalctl | grep cron
/var/log/cron
在 AWS Linux AMI 上。
sudo journalctl -u cron
cron
的确切位置非常依赖于系统。有一个单独的答案,其中详细介绍了如何在 Linux 系统(或更准确地说,使用 syslog
的系统)上配置各种日志记录目标。其他系统可能有不同的方式来配置这些东西。
至少有三种不同类型的日志记录:
执行程序之前的日志记录,仅在 cronjob 尝试执行命令时记录。正如@Matthew Lock 已经提到的,那个位于 /var/log/syslog 中。如@Spliffster 所述,在程序尝试执行后记录错误,可以将其发送到电子邮件或文件。我更喜欢记录到文件,因为使用电子邮件 THEN 你有一个新的问题来源,它会检查电子邮件发送和接收是否正常工作。有时是,有时不是。例如,在您对配置 smtp 不感兴趣的简单普通台式机中,有时您更喜欢记录到文件: * * * * COMMAND_ABSOLUTE_PATH > /ABSOLUTE_PATH_TO_LOG 2>&1 我也会考虑检查 /ABSOLUTE_PATH_TO_LOG 的权限,并从该用户的权限运行命令。仅用于验证,同时测试它是否可能是问题的潜在来源。程序本身的日志记录,具有自己的错误处理和用于跟踪目的的日志记录。
cronjobs 有一些常见的问题来源: * 要执行的二进制文件的绝对路径。当您从 shell 运行它时,它可能会工作,但 cron 进程似乎使用另一个环境,因此如果您不使用绝对路径,它并不总是能找到二进制文件。 * 二进制文件使用的库。它或多或少与前一点相同,但请确保,如果只是输入命令的名称,则指的是使用完全相同的库的二进制文件,或者更好的是,检查您引用的二进制文件是否带有绝对路径与您直接使用控制台时所指的完全相同。可以使用 locate 命令找到二进制文件,例如:
$locate python
确保您将引用的二进制文件与您在 shell 中调用的二进制文件完全相同,或者使用您计划放入 cronjob 的绝对路径在 shell 中再次测试。
另一个常见的问题来源是 cronjob 中的语法。请记住,您可以将特殊字符用于列表(逗号)、定义范围(破折号 -)、定义范围增量(斜杠)等。看看:http://www.softpanorama.org/Utilities/ cron.shtml
这是我的代码:
* * * * * your_script_fullpath >> your_log_path 2>&1
>>
附加,2>&1
表示将标准错误发送到与标准输出相同的位置。
在 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.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/
cron
已经通过邮件将它运行的每个作业的标准输出和标准错误发送给 cron 作业的所有者。
您可以使用 crontab
文件中的 MAILTO=recipient
将电子邮件发送到不同的帐户。
为此,您需要让邮件正常工作。投递到本地邮箱通常不是问题(事实上,ls -l "$MAIL"
可能会显示您已经收到了一些邮件),但是将其从盒子中取出并发送到 Internet 需要 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 中,warn
和 die
打印到标准错误;在 Python 中,写入 sys.stderr
,或使用 logging
;在 Ruby 中,尝试 $stderr.puts
。还要注意错误消息应该如何包含产生诊断消息的脚本的名称。
使用命令 crontab -e
,然后将 cron 作业编辑为
* * * * * /path/file.sh > /pathToKeepLogs/logFileName.log 2>&1
这里,2>&1
表示标准错误 (2>
) 被重定向到标准输出 (&1
) 指向的相同文件描述符。
如果您仍然想检查您的 cron 作业,您应该在 cPanel 中设置 Cron 作业时提供一个有效的电子邮件帐户。
当您指定有效的电子邮件时,您将收到执行的 cron 作业的输出。因此,您将能够检查它并确保一切都已正确执行。请注意,如果 cron job 命令没有输出,您将不会收到电子邮件。
请记住,对于每个已执行的 cron 作业,您都会收到一封电子邮件。如果您的 cron 运行过于频繁,这可能会淹没您的收件箱
如果您使用 sudo 运行某些命令,它将不允许。 Sudo 需要一个 tty。
sudo
配置。需要在没有提供密码的情况下运行的东西应该在您的 sudoers
配置中使用 NOPASSWD:
进行配置。
2>&1
含义说明:stackoverflow.com/questions/818255/in-the-bash-shell-what-is-21stderr
和stdout
,则2>&1
必须位于间接之后:myjob.sh >> /var/log/myjob.log 2>&1
YYYY-MM-DD_hh-mm-sec
,使每个文件名都不同且保持不变?date +\%Y\%m\%d\%H\%M\%S
-cron.log 2>&1