
Linux 定时任务(cron)默认不记录详细执行日志,导致任务失败时难以排查。要查看和调试 cron 日志,关键在于确认系统是否启用 cron 日志、日志路径是否正确、以及任务输出是否被重定向。
cron 日志是否开启
多数发行版(如 Ubuntu、Debian)默认启用 rsyslog 对 cron 的记录,但 CentOS/RHEL 8+ 默认使用 journald 且可能关闭 cron 日志。需检查:
- 检查 rsyslog 配置:运行 grep cron /etc/rsyslog.conf,确认存在类似 cron.* /var/log/cron 的行,且未被注释
- 重启 rsyslog 服务:sudo systemctl restart rsyslog(若修改过配置)
- 检查 journald 设置(RHEL/CentOS 8+):sudo journalctl -u crond -f 可实时查看,但默认不持久保存;如需长期留存,需配置 Storage=persistent 在 /etc/systemd/journald.conf
查看 cron 系统日志
日志内容包含任务触发时间、用户、命令执行状态,但 不包含命令本身的 stdout/stderr 输出。
- 标准日志路径:/var/log/cron(常见于 CentOS/RHEL)或 /var/log/syslog(Ubuntu/Debian 中 cron 条目混在其中)
- 快速筛选 cron 条目:sudo grep CRON /var/log/syslog 或 sudo tail -f /var/log/cron
- 注意时间格式:日志中显示的是系统本地时间,与 crontab 中设置的时间需时区一致(可通过 timedatectl 确认)
捕获任务实际输出(调试核心)
cron 环境变量精简(无 PATH、HOME 等),且默认丢弃 stdout/stderr。必须手动重定向才能看到脚本真实运行情况。
- 在 crontab 中重定向输出:例如
* * * * * /path/to/script.sh >> /tmp/script.log 2>&1
或更明确地分开:
* * * * * /path/to/script.sh >> /tmp/script.log 2>> /tmp/script.err - 避免使用相对路径:脚本内所有路径(如文件、命令)建议用绝对路径,或在脚本开头显式设置:
cd /home/user/myscript && ./do.sh - 模拟 cron 环境调试:用 env -i HOME=$HOME PATH=/usr/bin:/bin /bin/sh 启动 shell,再运行你的命令,可复现多数环境问题
验证与排障小技巧
不要只依赖日志是否存在,要主动验证执行逻辑。
- 测试最小化任务:* * * * * date >> /tmp/cron-test.log 2>&1,等待 1 分钟检查文件是否生成
- 检查 crond 服务状态:sudo systemctl status crond(或 cron),确保是 active (running)
- 确认用户权限:root 的 crontab 和普通用户的 crontab 日志行为一致,但输出路径需有写入权限;使用 sudo -u username bash -c ‘echo $PATH’ 查看该用户 cron 环境 PATH






























