最常见原因是cron守护进程未重启以读取更新后的时区设置,导致仍按旧时区解析时间表达式;需用timedatectl确认时区为Asia/Shanghai、检查/etc/localtime软链接正确、并执行sudo systemctl restart crond确保生效。

最常见原因是 cron 守护进程未读取更新后的时区设置,导致它仍按旧时区解析时间表达式。系统时间显示正确,但 cron 自己“认为”的当前时间是错的。
确认系统时区是否真正生效
运行以下命令检查当前时区配置是否一致:
-
查看时区名称:
timedatectl | grep "Time zone"—— 输出应为类似Asia/Shanghai (CST, +0800) -
验证 /etc/localtime 是否为正确软链接:
ls -l /etc/localtime—— 应指向/usr/share/zoneinfo/Asia/Shanghai,而非/etc/timezone或其他错误路径 -
检查 /etc/timezone 文件内容(如存在):
cat /etc/timezone—— 值应为Asia/Shanghai,不能是CST或UTC+8这类非标准标识
重启 crond 并验证服务状态
即使系统时间、时区文件都正确,crond 进程本身不会自动重载时区。必须手动重启:
- 执行
sudo systemctl restart crond(systemd 系统)或sudo service crond restart(SysVinit) - 立即检查状态:
sudo systemctl status crond,确认 Active 状态为active (running)且无报错 - 注意:仅重启服务器或 reload 配置无效,必须 restart
检查 cron 日志中的实际触发时间
直接看 cron 自己“怎么理解时间”:
- 启用 cron 日志(若未开启):
sudo sed -i 's/^#*\(cron.*\)yes/\1yes/' /etc/rsyslog.conf && sudo systemctl restart rsyslog - 查看最近调度记录:
sudo tail -20 /var/log/cron - 找类似这样的行:
Oct 10 00:10:01 ip-172-31-xx-xx CROND[12345]: (ec2-user) CMD (/path/to/script.sh)—— 这里的00:10:01就是 cron 实际触发的时间点,与系统当前时间对比即可确认偏差值
排除 crontab 解析异常和用户级干扰
某些发行版(如 Amazon Linux)的 crond 版本对时区更敏感,还需检查:
- 避免在
/etc/crontab或/etc/cron.d/中使用CRON_TZ以外的时区声明;如需指定任务专属时区,应在对应条目前加CRON_TZ=Asia/Shanghai - 确认用户级 crontab(
crontab -e)未被意外覆盖或权限异常:ls -l /var/spool/cron/应显示属主为对应用户,且不可被组/其他写入 - 临时添加一条测试任务:
* * * * * date >> /tmp/cron-test.log 2>&1,等 1–2 分钟后检查日志中写入的时间是否与date命令输出一致


















