
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










