我的 cron 任务比服务器时间晚了一个小时。我不明白发生了什么。
我的配置如下:
服务器时间:
Europe/Paris
在 /etc/default/cron 中我添加了以下行:
TZ="Europe/Paris"
尽管如此,cron 任务的启动时间比服务器时间晚一个小时。真正棘手的是,如果我要求 cron 执行指令“date”,它会给出服务器日期(正确的日期!)。
我不知道如何解决这个问题;我在论坛上读了一些资料,但没有发现什么有趣的东西。
你怎么认为 ?
答案1
(复制我的评论作为答案,因为它结果是解决方案;我猜对了。)
因此,cron 作业正在按照 UTC 进行安排(Europe/Paris
与 UTC 相差一小时)。
Vixie cron 手册页说:
如果存在,守护进程将使用 /etc/timezone 中的时区定义。
里面有什么/etc/timezone
?你修改过/etc/timezone
比 cron 进程启动时间更近的内容吗?你试过
/etc/init.d/cron restart
?
答案2
一些发行版(例如 Fedora)提供了一种机制,您可以通过设置CRON_TZ=
来覆盖默认时区。
来自 Fedoraman 5 crontab
CRON_TZ 变量指定 cron 表所特有的时区。用户应根据指定的时区在表中输入时间。用于写入日志文件的时间取自守护进程运行的本地时区。
像这样:
#m h d m wday command
CRON_TZ="Europe/Paris"
5 0,6,12,18 * * * /path/to/script.bash
答案3
维基百科说
大多数 cron 实现只是解释 cron 守护进程本身运行的系统时区设置中的 crontab 条目。如果大型多用户计算机的用户位于多个时区,这可能会引起争议,尤其是当系统默认时区包括可能令人困惑的 DST 时。因此,cron 实现可能会对用户 crontab 中的任何“TZ=”环境变量设置行进行特殊处理,解释相对于该时区的后续 crontab 条目
那么,您的登录 ID 的 TZ 设置是否可能与系统 TZ 设置不同?
答案4
刚刚在 Ubuntu 14/16 上解决了这个问题。对我来说非常完美。
步骤(隐含 sudo):
cat /etc/timezone
rm -fv /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Kolkata /etc/localtime
apt install -y --reinstall tzdata
/etc/init.d/rsyslog restart
tail -f /var/log/syslog
cat /etc/timezone