如何查看 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。