Startup

當系統時間從 NTP 變為正確時,如何在系統啟動期間知道

  • May 16, 2019

我有一個執行 Raspbian(Debian 衍生產品)的 Raspberry Pi,它正在記錄實時溫度。作為其中的一部分,我需要一個精確到幾秒鐘的時鐘。在伺服器啟動時的正常操作中,我知道 Raspberry Pi 會定期通過網路連接到 NTP 伺服器,以確保其本地時鐘合理地接近正確時間。這種精度水平對我的應用程序來說很好。Raspberry Pi 沒有電池供電的時鐘來保持伺服器關閉或斷電時的時間,因此當它第一次啟動時,系統時間不正確,直到它建立網際網路連接並通過 NTP 獲得正確的時間。

我發現問題的地方是停電並且 Raspberry Pi 關閉了一段時間沒有電源,然後在稍後的某個時間(比如 30 分鐘)重新啟動。Pi 啟動,我的應用程序啟動並再次開始記錄溫度,但 Pi 上的時鐘不正確,因此它使用錯誤的時間戳記錄溫度。它似乎以某種方式保存了最後一個已知時間並從那裡開始(重新啟動時它不會重置為紀元時間)。最終,當 Pi 所在的 LAN 恢復並重新連接網際網路時,Pi 將更正其時間(通過 NTP),但在此之前,我記錄了不准確的時間戳。

我試圖弄清楚解決這個問題的最佳行動方案是什麼?

出於維護原因,我寧願不添加電池支持的附加時鐘(不希望任何人必須更換電池,因為這本質上是一個嵌入式設備,使用者不容易訪問)。

我願意讓我的應用程序推遲記錄溫度,直到我知道時間已從網路準確檢索,但我什至不知道如何檢測該狀態。任何人都知道如何知道時間現在何時從 NTP 伺服器更新並且現在是正確的?

我的應用程序是通過在啟動時執行腳本來啟動的。

關於如何解決這個問題的任何其他想法?

每次你重啟你的樹莓派(這需要幾秒鐘以上),你的時鐘就會關閉,超過ntp可以通過延長/縮短時間來補償的時間(即迴轉,這僅適用於校正時鐘)稍微偏離,例如由於實時時鐘每天慢或快一秒左右),ntp必須設置時鐘。

所以最簡單的可能是有一個腳本來啟動你的溫度測量程序第一次呼叫ntpdate或等效,它根據檢索值的距離來設置日期或擺動。因此,如果時鐘已經設置為接近正確,例如如果您通過此腳本重新啟動而沒有重新啟動,ntpdate則不會破壞事情。ntp

查看ntp-waitNTP 附帶的程序。你執行它,它會等到你的時鐘同步,然後退出。(或者它最終放棄,並退出並出現錯誤。)您可以使用它來阻止您的腳本在時鐘同步之前啟動。

您還可以執行類似ntpq -porntpq -c rv並解析輸出以檢查時鐘的狀態。事實上,ntp-wait一個簡短的 Perl 腳本就是這樣做的。

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