Timezone

at 怎麼知道會有時間變化?

  • October 27, 2019

我碰巧在at昨天凌晨 2 點 40 分左右閒逛。(不要問…)我嘗試在未來一分鐘安排活動(作為測試),但 - 它只是沒有發生。事件都在隊列中,但他們只是在 2 點 41 分的時候呆在那裡,沒有任何事情發生。我放棄了,去睡覺了。

發生了什麼事?好吧 - 事實證明今天夏令時在挪威結束(夏令時),所以今晚確實發生了兩次 2:41!果然,在第二個(即從夏季時間看到的 3:41),at然後啟動了那些預定的事件。

這是如何運作的?調度為什麼以及如何知道時間變化,並選擇第二次,而不是在時間超過指定時間時才這樣做?

at嘗試解析給定的日期和時間,並在mktime()“夏令時”設置為 -1(不可用,自動檢測)的情況下執行它。

at原始碼:

 tm1.tm_isdst = -1;
 t = mktime (&tm1);

man 3 mktime:

tm_isdst 欄位中指定的值通知 mktime() 對於 tm 結構中提供的時間,夏令時 (DST) 是否有效:正值表示 DST 有效;零表示 DST 無效;負值意味著 mktime() 應該(使用時區資訊和系統數據庫)嘗試確定 DST 在指定時間是否有效。

mktime() 函式對 tm 結構的欄位進行如下修改:

$$ … $$tm_isdst 分別設置(不管其初始值)為正值或 0,以指示 DST 在指定時間是否有效。

因此mktime()決定 DST 是否生效;並且它似乎更喜歡兩個可能的選擇中的較晚日期(儘管從文件中不清楚該決定是如何做出的)。

at然後將其轉換為 UNIX 時間戳(自 1970 年 1 月 1 日以來的秒數)。一旦你有了它,就不再有時間變化之類的東西了。將時鐘來回更改一小時只會改變人類對時間的表示,或者你所在的時區;它不會更改自紀元以來的秒數,也不會更改任務執行前的秒數。


我嘗試在未來一分鐘安排活動(作為測試)

在旁注中,您可以使用類似的表達式next minute,它將在下一分鐘執行,時間更改或否。

引用自:https://unix.stackexchange.com/questions/549019