cron / crontab日志在哪里?

我想要确认我的cron job是否在执行,并且在什么时间执行。我相信有一个记录我的sudo crontab -e任务的日志文件,但是在哪里呢?
我在谷歌上搜索并找到建议去查看/var/log(但是我没有在其中看到任何带有'cron'名称的文件),并且编辑/etc/syslog.conf文件(但我也没有这个文件)。

6请注意,在“crontab”上下文中,“%”字符会创建一个新行,因此滥用它(例如在date +"%Y-%m-%d"中不转义)可能会导致正确的日志记录失败(date +%Y-%m-%d >> /tmp/cron.log 不起作用)。另外,这个答案可能会有所帮助。 - Skippy le Grand Gourou
3我一直搞不清楚为什么我的定时任务没有运行,直到我看到Skippy的评论。我使用的语法是script.sh >> "build-logs-$(date +%Y%m).txt"来保存日志。转义符号%解决了问题,即script.sh >> "build-logs-$(date +\%Y\%m).txt" - Jonathan
17个回答

在默认安装中,cron作业被记录到
/var/log/syslog

您可以运行以下命令,在该日志文件中查看cron作业:
 grep CRON /var/log/syslog

如果你没有重新配置任何东西,条目将会在那里。

78如果没有安装MTA(邮件传输代理),cron会直接丢弃任务的输出。 - Barry Kelly
19cron日志可能在/var/log/目录中的另一个文件中。请检查cron.log或等效文件。 - Navigatron
在systemd系统上使用journalctl | grep cron - Microsoft Linux TM
19这不会给我工作的输出。它只会给出一个通用的消息,表示cron已经处理完毕。 - chovy
2我没有安装MTA,但输出保存在/var/log/syslog。它每天旋转一次。 - springloaded
...如果系统日志循环了,你可能会在 /var/log/syslog.1 或者其中一个压缩的 /var/log/syslog.*.gz 文件中找到你的信息。 - John K. N.
我需要在grep中使用小写的cron,因为我要查找的错误信息是:Jan 18 10:40:01 hostname cron[1079]: (*system*filename) INSECURE MODE (group/other writable) (/etc/cron.d/filename) - Shadi
12在AWS上,它是/var/log/cron。 - tsukimi
如果你不是root用户,无法访问系统日志,那么用户特定的crontab是否有日志记录? - CMCDragonkai
我在crontab上有两个任务,但是你的命令只显示了其中一个! - Dr.jacky
11@shadi,你也可以使用grep -i CRON进行不区分大小写的搜索。 - nafg
1在Systemd系统上(比学生的建议更好):journalctl -u cronie。将cronie替换为您正在使用的任何cron实现。在u之前添加一个e以自动跳转到末尾,或者添加一个f以显示新条目的出现。 - Dessa Simpson
在Ubuntu 18.04容器中,对我来说文件不存在。 - Nam G VU
1如果邮件没有配置,用户计划任务发送的任何消息都将保留在邮箱文件/var/mail/$USER中。 - Mikko Rantalainen
如果你想要漂亮的颜色,运行以下命令:grc grep CRON /var/log/syslog - Flimm
grep log /var/log/syslog 很酷 - vintagexav

你可以创建一个cron.log文件,只包含在syslog中显示的CRON条目。请注意,如果按照以下步骤操作,CRON作业仍将显示在syslog中。
打开文件。
/etc/rsyslog.d/50-default.conf

找到以以下内容开头的行:
#cron.*

取消注释该行,保存文件,并重新启动 rsyslog:
sudo service rsyslog restart

你现在应该在这里看到一个cron日志文件:
/var/log/cron.log

Cron活动现在将被记录到此文件中(除了syslog)。请注意,在cron.log中,您将看到cron运行/etc/cron.hourly、cron.daily等脚本的条目 - 例如:
Apr 12 14:17:01 cd CRON[14368]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

然而,除非这些脚本将输出重定向到 cron.log(或其他日志文件),否则您将无法查看有关 /etc/cron.daily 或 /etc/cron.hourly 实际运行了哪些脚本的更多信息。

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

01 14 * * * /home/joe/myscript >> /home/log/myscript.log 2>&1

这将把脚本产生的所有标准输出和错误重定向到指定的日志文件中。

2根据我的意见,这个答案在未来是更好的。这样你的系统日志文件会更清晰。 - shgnInc
14为了从syslog中排除cron日志,您可以将行*.*;auth,authpriv.none -/var/log/syslog更改为*.*;auth,authpriv.none,cron.none -/var/log/syslog - Koen.
在我们的CentOS 6上,cron.* 在 /etc/rsyslog.conf 中定义,而在 rsyslog.d 文件夹中是空的。 - Scott Chu
12>&1代表什么? - John Joe
4@JohnJoe 2>&1 被用于将标准错误输出转发到标准输出,这样你也可以将标准错误输出到日志文件中。 - Sampo Sarrala - codidact.org
要如何配置日志保留的时间长度?这是我在使用系统日志时遇到的问题 - 我只能看到今天发生的事情。 - Sridhar Sarnobat
1在Ubuntu和Debian上,查看/etc/logrotate.d/rsyslog文件-你会发现在顶部有/var/log/syslog每天轮转并保留7天的日志。向下滚动,你会看到/var/log/cron.log每周轮转并保留额外的4周日志。如果需要其他设置,你可以覆盖logrotate配置 - user12345
我花了几个小时才弄清楚为什么没有cron日志,这解决了问题。谢谢! - Umar.H

有时候持续监控它可能会很有用,如果是这种情况:
tail -f /var/log/syslog | grep CRON

29嗯,你可能想要使用-F选项,它会跟踪文件的名称变化,这样当文件被截断/移动到/var/log/syslog.1.gz时,你仍然可以继续追踪当前的/var/log/syslog文件。根据man手册,这与运行tail xxxx -f --retry命令是一样的。 - Momer

你还可以将各个cron作业的输出直接定向到它们自己的日志文件中,以提高可读性,只需在某处添加日期的输出即可。
 0 15 * * *    /home/andrew/daily-backup.sh >> /var/log/daily-backup.log 2>&1

5如果这行代码由于语法错误而无法运行,那么在指定的输出日志中将不会写入任何内容。 - Raptor
18你可以在指定日志文件后面添加2>&1来解决这个问题。在将cron作业添加到crontab之前,最好先进行测试,并确保第一次计划运行时出席以确保crontab的正确格式化。 - Andrew Meyer
3如果 daily-backup.log 文件不存在,CRON 会自动创建它。 - Nagabhushan S N
这真的非常有帮助,因为我的 PHP 结果被追加到日志中。唯一的负面是没有换行。 - Mark Lee

如果您的系统上安装了systemd,您可以使用journalctl命令来显示cron作业日志。
例如,在我的Ubuntu 17.10上:
journalctl -u cron.service

如果您使用cronie,请尝试运行journalctl -u cronie.service - Aditya

journalctl -t CROND

在Ubuntu >=18上,可能是这样的。
journalctl -t CRON

journalctl手册中:
   -t, --identifier=SYSLOG_IDENTIFIER|PATTERN
       Show messages for the specified syslog identifier SYSLOG_IDENTIFIER, 
       or for any of the messages with a "SYSLOG_IDENTIFIER" matched by PATTERN.

       This parameter can be specified multiple times.

2在 Ubuntu 20 上,你可以使用标签 CRON,而标签 CROND 不会有任何结果。 - Cie6ohpa
1在RHEL 7上,大多数作业由anacron运行,而/var/log/cron中的信息比journalctl -t CROND更加有用。 - Dima Korobskiy

这是一个非常老的问题,但是这些答案都不令人满意。
首先,让你的cron job每分钟运行一次,然后以非守护进程的方式运行cron(暂时地,只需杀死已经启动的任何crond),并进行测试日志记录:
crond -nx test
然后通过终端查看程序执行的日志流。

11无法在14.04上运行 - 未找到命令'crond',您是否指的是: 来自软件包'cron'(main)的命令'cron' - G-.
今天在Ubuntu 18.04上出现了同样的错误。 - Nam G VU
crond和cron是相同的,crond在RedHat、CentOS和Suse平台上使用。而cron在Ubuntu上使用。因此,根据您的系统,使用crond或cron。 - Kalamarico

你可以将的输出重定向到一个临时文件中。 例如:
00 11 07 * * /bin/bash /home/ubuntu/command.sh > /tmp/output 2>&1

错误和正常输出都将被重定向到同一个文件中。

默认情况下,它位于/var/log/syslog

但是可以设置为创建一个单独的cron.log,这样更有用。

这个问答描述了这个过程:

16.04:如何让cron创建cron.log并实时监控?

此外,在这个答案中还有创建一个wcron命令的说明,它显示的是准实时的。此外,它链接到另一个答案,

如何更改cron日志级别?

该答案显示如何更改日志级别以包括不仅仅是作业的开始-级别15将显示错误和结束时间。


如前所述,cron作业被记录在/var/log/syslog中。
您可以将syslog导入grep并过滤掉CRON日志,就像这样。
less /var/log/syslog | grep CRON 

你可以像这样搜索你的crontab日志。
less /var/log/syslog | grep CRON | grep <search-keyword-comes-here>

您可以通过搜索存储在gz文件中的crontab历史日志来查询,就像这样。
less /var/log/syslog.2.gz | grep CRON | grep <search-keyword-comes-here>

拥有日志记录机制一直被认为是很好的,你可以快速为你的服务器设置ELK,你也可以尝试使用logz