【问题标题】:Is it possible to configure a crontab to adjust its times when daylight savings time is in effect? [closed]是否可以配置 crontab 在夏令时生效时调整其时间? [关闭]
【发布时间】:2021-12-16 13:38:51
【问题描述】:

我有一个 crontab 在 UTC 时间运行的 Ubuntu 服务器上安排许多事情。一些正在运行的脚本相对于它们为其提供功能的 Web 应用程序而言是时间敏感的。

例如每天下午 4 点必须更新一些内容,因为最终用户会在他们的时钟上看到它。

在英国采用 GMT 的冬季,这不是问题,但从 4 月到 10 月,英国夏令时 (BST) 的时钟会提前一小时。然后,服务器上运行的脚本会在用户看来是下午 5 点(而不是下午 4 点)更新 Web 应用程序。

有没有办法为这个时区变化有条件地调整 crontab 的计划时间?


下面的意图是在每个月的第一天 00:00 运行。在 BST 期间,我的理解是这将在夏令时期间的 01:00 BST 运行:

# m  h dom mon dow   user   command
  0  0   1   *   *   root   cd / && run-parts --report /etc/cron.monthly

我有哪些选项可以确保在 GMT 和 BST 期间始终在 00:00 运行?

服务器时区信息

$ timedatectl
               Local time: Mon 2021-11-01 22:57:41 UTC
           Universal time: Mon 2021-11-01 22:57:41 UTC
                 RTC time: Mon 2021-11-01 22:57:41
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: n/a
          RTC in local TZ: no

【问题讨论】:

  • 无论如何,TYPICAL 情况是服务器在 LOCAL 时间运行,因此所有 crontab 作业将在预期时间自动运行,无论是“标准”时间还是“日光”时间。操作系统管理偏移量,而不是 crontab。但你的是一个“特例”。我喜欢 Cyrus 的解决方法below。你可能需要做一些小的调整,但基本的想法是合理的:)
  • @paulsm4 我一直致力于建议最好将数据库保持在 UTC 中,并假设将其扩展到操作系统本身以避免时区变得复杂和不可预测。我们在构建 Web 应用程序时考虑了本地时间,并根据最终用户的需要将它们转换为其他时区。然而,在基础级别,我们知道,该层之外的所有内容都被标准化为全面的 UTC。

标签: linux bash ubuntu cron


【解决方案1】:

在上面的 cmets 中,我赞扬了 Cyrus 的回复,我认为这听起来很有希望。显然,他不同意,并删除了他的回复。哦,好吧……

这对您来说可能是一个不错的选择:

https://www.the-art-of-web.com/system/cron-set-timezone/

如果您与某些客户处于不同的时区,或者有 使用 UTC 来避免夏令时更改的服务器,它可以是 设置在正确时间以不同方式运行的 CRON 脚本很棘手 时区。在这里,我们探讨了几个解决方案。 ...

[您可以]为 CRON 指定时区:

# m h  dom mon dow   command
TZ=Australia/Sydney
0 0 * * * www-data /usr/bin/php $CRONSCRIPT

很遗憾,在这里设置时区对 触发 CRON 脚本。它所做的是设置环境 调用脚本的 shell 中的变量。剧本 然后它自己可能会使用 TZ 时区...

# m h  dom mon dow   command

SHELL=/bin/bash
TZ=Australia/Sydney
0 * * * * www-data [ "$(date +\%H\%M)" == "0000" ] && /usr/bin/php $CRONSCRIPT

成功!我们现在有一种在午夜触发脚本的方法 时区。 CRON 命令将每小时触发一次,但仅 如果目标时间是午夜,则继续运行 PHP 脚本 区域。

只需将您的任务替换为“php”,您就可以开始了!

【讨论】:

    【解决方案2】:

    如果您在格林威治标准时间,请等待一小时:

    0 23 0 * * root [ "$(date +'%Z')" == "GMT" ] && sleep 1h; cd / && run-parts --report /etc/cron.monthly
    

    【讨论】:

    • 谢谢。格式化日期时区时,是不是只给出了服务器本身的时区,永远是UTC?
    • 也许其他人可以回答这个问题。
    猜你喜欢
    • 2011-11-05
    • 2013-12-23
    • 1970-01-01
    • 2012-05-26
    • 2017-08-12
    • 2017-03-02
    • 2020-02-05
    • 1970-01-01
    • 2012-10-16
    相关资源
    最近更新 更多