cron 的时区问题

cron 的时区问题

我的 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):

  1. cat /etc/timezone
  2. rm -fv /etc/localtime
  3. ln -s /usr/share/zoneinfo/Asia/Kolkata /etc/localtime
  4. apt install -y --reinstall tzdata
  5. /etc/init.d/rsyslog restart
  6. tail -f /var/log/syslog
  7. cat /etc/timezone

相关内容