夏令时和 Cron

问题描述 投票:0回答:3

如果 Cron 有一项作业计划在凌晨 2 点运行,另一项作业在凌晨 3 点运行,那么这些作业会受到夏令时的影响吗?

当时间向后拨一小时时,时间是否会直接从凌晨 2:59:59 变为凌晨 2:00:00?这意味着凌晨 2 点的作业将运行两次,凌晨 3 点的作业将运行一次?或者时间是否首先更改为凌晨 3:00:00,然后更改为凌晨 2:00:00,导致两个作业运行两次?

当时间向前移动一小时时,时间是否会从凌晨 1:59:59 变为凌晨 3:00:00,导致凌晨 2 点的作业无法运行而凌晨 3 点的作业运行一次?或者时间从凌晨 2:00:00 转移到 3:00:00 是否会导致两个作业都运行一次?

简而言之,我想知道的是,当增加一个小时时,凌晨 3 点是否会发生一次或两次,而减少一个小时时,凌晨 2 点是否会发生。我在谷歌上搜索时找不到任何关于此的信息。

cron dst
3个回答
53
投票

答案取决于您使用的 cron 的变体/扩展。某些变体不处理夏令时,导致作业丢失和作业运行两次。

如果您使用 Paul Vixie cron,那么它确实可以处理 DST 更改。根据 cron 手册页

cron 每分钟检查一次,看看它的假脱机目录是否在 modtime(或 /etc/crontab 上的 modtime)已更改

此外,参考夏令时(第二段清楚地解释了你的答案)

夏令时和其他时间变更

当地时间变化少于三小时,例如由于 夏令时的开始或结束,会进行特殊处理。这 仅适用于在特定时间运行的作业以及已运行的作业 粒度大于一小时。运行更自由的工作 正常安排。

如果时间向前推进,那些本应在中间运行的工作 被跳过的 val 将立即运行。反之,如果时间 已向后移动,请注意避免运行作业两次。

时间变更超过3小时将被视为更正 时钟或时区,并立即使用新时间。

因此,每当时间变化可能是 2:59:59 或 3:00:00 时,cron 就会通过处理情况并仅运行错过的作业来处理作业,并避免运行已经运行的作业。


1
投票

说清楚一点,这取决于你住在哪里,你的 cron 作业是如何安排的(Unix cron 需要你处理,而 Java 调度程序自己处理!)。

在美国,时钟更改时间为当地时间凌晨 2:00。春季,时钟从凌晨 1:59 调快至凌晨 3:00;秋季,时钟从凌晨 1:59 回落至凌晨 1:00

在欧盟,时钟更改时间为世界标准时间凌晨 1:00。春季,时钟从中午 12:59 调快至凌晨 2:00;秋季,时钟从凌晨 1:59 回落至凌晨 1:00

示例:如果您在 2020 年 10 月 25 日今天凌晨 1:30 有一个 Unix cron 作业,那么您的作业会运行两次。


0
投票

2023 年更新给那些发现这个问题的人:

服务器不应该在白天运行

当夏令时结束并且时间戳重复时,太多的事情就会被破坏。管理员永远不会记得这是问题的根本原因。

但当然不是每个人都遵循最佳实践。

现代操作系统可以很好地保护您免受 DST 意大利面条的影响。

台式机可以在夏令时运行

这种情况下mtk的回答还是很棒的。假设换班时间为 02:00

  • 夏令时凌晨 3 点作业的开始和结束运行一次
  • 夏令时凌晨 2 点作业的启动只能运行一次
  • DST 凌晨 2 点作业结束将运行一次

另外一个好的做法是不要在最小时安排用户作业,例如凌晨 02:01 开始

最佳实践

cron 无法执行十月的第一个星期日等,因此您的脚本应该管理 DST 调整。

© www.soinside.com 2019 - 2024. All rights reserved.