我碰巧在at
昨天凌晨 2 点 40 分左右闲逛。(不要问...)我尝试在未来一分钟安排活动(作为测试),但 - 它只是没有发生。事件都在队列中,但他们只是在 2 点 41 分的时候呆在那里,没有任何事情发生。我放弃了,去睡觉了。
发生了什么事?好吧 - 事实证明今天夏令时在挪威结束(夏令时),所以今晚确实发生了两次 2:41!果然,在第二个(即从夏季时间看到的 3:41),at
然后启动了那些预定的事件。
这是如何运作的?调度为什么以及如何知道时间变化,并选择第二次,而不是在时间超过指定时间时才这样做?
at
尝试解析给定的日期和时间,并在mktime()
“夏令时”设置为 -1(不可用,自动检测)的情况下运行它。at
源代码:man 3 mktime
:因此
mktime()
决定 DST 是否生效;并且它似乎更喜欢两个可能的选择中的较晚日期(尽管从文档中不清楚该决定是如何做出的)。at
然后将其转换为 UNIX 时间戳(自 1970 年 1 月 1 日以来的秒数)。一旦你有了它,就不再有时间变化之类的东西了。将时钟来回更改一小时只会改变人类对时间的表示,或者你所在的时区;它不会更改自纪元以来的秒数,也不会更改任务运行前的秒数。在旁注中,您可以使用类似的表达式
next minute
,它将在下一分钟运行,时间更改或否。