Linux系統時間校正及自動排程校時
嗯,雖然說要寫C#,但好像不知道從何寫起,就先寫最近剛解決的問題好了。
前言
上一篇裡面,我寫了這樣一段話
這個時候十之八九就是時區的問題了,Hugo預設的時區都是
UTC+0,所以假設我在台北時間2023-01-01 01:00設定了date: 2023-01-01, 但其實Hugo認定目前的時間是UTC+0,也就是2022-12-31 17:00,時間還沒到,自然無法顯示文章。解決的方法也很簡單,在config.toml中加入這行
1timeZone = "Asia/Taipei"就可以把時區調到臺北,行為就會合理了。
正當我天真的以為問題解決時,幾天後開一篇新的文章來寫,發現又出現同樣的問題了。
當然我很快就發現,Hugo雖然有預設時區,但時間抓的卻是系統時間。
再看看我系統的時間,果然,晚了兩天,我的WSL依舊是正常發揮。
這個問題已經不是第一次遇到了,包括之前每次push完code,上去網站看,commit紀錄都是顯示昨天或是好幾天前推上去的,十分惱人。
直到這次的契機,才打算好好正視這個一直存在的問題。
手動校時
眾所周知,在Linux中取得系統時間的方式如下
1creeperjong@DESKTOP-TQKFNBI:~$ date
2Fri Jan 13 13:25:19 CST 2023
若你發現系統時間有所誤差,可以輸入以下指令進行手動校時
1sudo ntpdate time.stdtime.gov.tw
其中,time.stdtime.gov.tw是中華電信提供的時間校對服務URI,可透過ntpdate套件指定NTP server來進行校時。
當然,系統時間與BIOS的時間是分開的,所以這裡一起校正BIOS的時間,以免又出一堆有的沒的的問題。
1sudo hwclock -w
其中-w便代表將系統時間寫入BIOS時間。
這個做法我用了將近兩年(從開始用WSL到現在),起初因為剛開始學程式,學的都是皮毛,系統時間根本不足一提。
但最近不管是Git的使用上,或是各種需要取用系統時間的服務,時間的不準確一直困擾著我,想著每次都手動校時也不是辦法,於是這個方法也慢慢被我捨棄了(必要時還是會用)。
排程校時
Cron是Unix-Like OS中基於時間的排程系統,換句話說,你可以指定作業系統定期做某些事情,像是每十分鐘就向不回信的教授寄一封信之類的。
在/etc/crontab中,紀錄的便是Cron所排程的時間表,格式如下:
1.---------------- 分 (0 - 59)
2| .------------- 時 (0 - 23)
3| | .---------- 日 (1 - 31)
4| | | .------- 月 (1 - 12) 或 jan,feb,mar,apr ...
5| | | | .---- 週 (0 - 6) (Sunday=0 or 7) 或 sun,mon,tue,wed,thu,fri,sat
6| | | | |
7* * * * * 使用者名稱 要執行的指令
在我們的例子中,會新增如下的排程:
100 12 * * * root (/usr/sbin/ntpdate time.stdtime.gov.tw && /sbin/hwclock -w) &> /dev/null
意及每天中午12點整,用root的身分執行系統校時,並寫入BIOS時間,最後將所有輸出捨棄。
Crontab解說:
*: 每個單位都執行一次(例:每天、每個月...)
,: 列舉執行時間(例:0,30 * * * * 代表每分鐘的第0,30秒執行一次)
-: 執行時間範圍(例:0 9-12 * * * 代表每天9點到12點每小時整點執行一次)
%: 間隔時間(例:*%10 * * * * 代表每10秒執行一次)
&>: Shell中的重定向運算子,將stdout和stderr導向至參數所帶之文件
/dev/null: 導向至此的資料會被捨棄
這時候又出現另一個問題了。如果Cron是基於時間的排程系統,那是否代表它也需要看系統時間來做事?
因此就會出現未校正前的時間是13:00:00,我還要等上整整一天才可以跑我的排程。
所以後來又改成了這樣
100 * * * * root (/usr/sbin/ntpdate time.stdtime.gov.tw && /sbin/hwclock -w) &> /dev/null
這樣就是不管系統時間是不是正確的,每隔一個小時就會校時一次,也算是暫時解決這個問題了。
後續
在寫這篇文的同時,我有一直去查各種校時的方法,在這段期間,我發現WSL的時間會不同步, 似乎是因為我讓電腦休眠的關係,導致我休眠一天,系統時間就停止了一天,想想好像也蠻合理的。
後來在網路上針對WSL校時做搜索,發現在2020年就有休眠導致WSL時間停止這個issue了,且在2021年4月的Release中解決了這個問題。
看了一下我WSL上次更新的時間是2020/11/2,相當於我裝完之後就沒更新過了...
總之,我把它更新了,會不會自動校時還不知道,希望這個問題就此解決(雖然網路上還是很多人沒有解決)。
除了手動和排程校時外,還可以使用NTP的服務進行自動校時,網路上都有很多教程,
這裡因為WSL似乎不支援網路上所提供的做法,加上我又懶得研究畢竟問題已經算解決了,
所以就不特別補充了。
未來若有其他發現,再考慮多發一篇文,紀錄一下一路踩坑的過程。
2023/2/14 更新
問題確定解決了,時間不會再跑掉了
但現在我每天早上打開電腦,VM的CPU Usage都是100%,每次都要重開
誰快來救我