如何查看 Red Hat 和 Debian 服务器的 crontab 日志

定时任务跑没跑、有没有报错,第一件事就是翻日志。但 Red Hat 和 Debian 两家的 cron 日志不在同一个位置,刚接触服务器的人很容易找不到。这篇文章把两边的查看方法、日志格式、和日志为空时的排查步骤都列出来。

Red Hat 系列(RHEL / CentOS / Fedora)

Red Hat 系的 cron 守护进程叫 crond(来自 cronie 包),日志默认写在 /var/log/cron。

直接看:

tail -f /var/log/cron

每条记录长这样:

Mar 21 10:00:01 hostname CRON[12345]: (alice) CMD (/home/alice/backup.sh)

CRON[12345] 是 cron 分配的进程 PID,(alice) 是执行任务的用户,CMD (...) 后面就是 crontab 里写的命令。命令执行成功、失败,都会原样记在这里,输出也会一并追加。

如果 /var/log/cron 看不到内容,去系统日志里找:

grep CRON /var/log/messages

Red Hat 系的 rsyslog 会把 cron 消息同时写到 /var/log/messages,两个文件内容基本一致。

systemd 发行版(RHEL 7+、CentOS 7+、Fedora)还可以用 journalctl:

journalctl -u crond --since "1 hour ago"

Debian 系列(Debian / Ubuntu)

Debian 系的 cron 守护进程叫 cron,日志默认写在 /var/log/syslog,不单独存一个 cron 文件。

看 cron 相关的记录:

grep CRON /var/log/syslog

条目格式和 Red Hat 一样,只是容器换成了 syslog:

Mar 21 10:00:01 hostname CRON[12345]: (alice) CMD (/home/alice/backup.sh)

有些 Debian/Ubuntu 系统会把 cron 单独写到 /var/log/cron,取决于 /etc/rsyslog.d/50-default.conf 里 #cron.* /var/log/cron 这行有没有被注释掉。如果注释掉了,cron 消息就只走 syslog;取消注释并重启 rsyslog,就会多出一个独立的 cron 日志文件。

journalctl 同样可用:

journalctl -u cron --since "1 hour ago"

日志条目怎么读

一条 cron 日志包含四个部分:

  • 时间:Mar 21 10:00:01,任务触发时的系统时间
  • 主机名:hostname,方便在多台机器的日志里区分来源
  • PID:CRON[12345],本次任务 fork 出的进程号,追查问题时有用
  • 用户和命令:(alice) CMD (/home/alice/backup.sh),crontab 里那一行的实际内容

如果命令执行失败,日志里会有对应输出。常见报错:命令不在 PATH 里(crontab 环境变量极简,建议用绝对路径)、脚本没有执行权限、输出被邮件系统拦截。

日志为空怎么办

先确认 cron 守护进程在跑:

systemctl status cron    # Debian
systemctl status crond   # Red Hat

没跑就启动它:systemctl start crond。

再看 rsyslog 是否正常:

systemctl status rsyslog

rsyslog 挂了,所有日志都会停。最后确认一下 cron 有没有被 SELinux 或 AppArmor 拦住——Red Hat 系默认开 SELinux,Debian 系某些发行版开 AppArmor,两者都可能阻止 cron 写日志或执行脚本。

一个省事的技巧

不确定日志在哪时,直接用 journalctl 不用区分发行版:

journalctl _COMM=cron --since "today"

_COMM=cron 匹配 cron 守护进程本身,不管发行版叫 crond 还是 cron,都能查到 cron 相关的全部记录。缺点是不支持 RHEL 6 那种不用 systemd 的老系统。

日常排查 cron 问题,记住两行就够:Red Hat 看 /var/log/cron,Debian 看 /var/log/syslog 里 grep CRON。