翻舊帳

2024年4月30日 星期二

Linux 的 timezone 設定問題

 昨天遇到一個謎團.

系統開機, 會先以正常的方式同步網路時間:
1. 使用 zoneinfo 的檔案更換 /etc/localtime
2. NTP client sync

接著詢問私網的 server, 獲得特定時區的差, 重新同步一次時間
3. 詢問時間差
4. 把 /etc/localtime 換回 UTC
5. NTP client sync, 另外加上時間差

謎團在於, 系統看到的時間, 與 daemon 裡看到的時間不同步.

舉例, #1 把時區設定為 Asia/Taipei, 做完 #5 之後, 會發現, Linux 系統跟 state machine daemon 的時間會差 8 個小時. Linux 系統使用 date, 會看到時區是 UTC, daemon 裡看到的時區應該是 CST(GMT+8).

很明顯, daemon 在 #4 之後沒有跟著變為 UTC.

如果在 #1, #4 變動 timezone 之後, 使用 setenv("TZ", timezone string, 1) 呢?

1. 使用 zoneinfo 的檔案更換 /etc/localtime, setenv("TZ", timezone string, 1)
2. NTP client sync
3. 詢問時間差
4. 把 /etc/localtime 換回 UTC, setenv("TZ", "UTC", 1)
5. NTP client sync, 另外加上時間差

則會出現另一個問題: daemon 裡看到的時區會回到 UTC, 但 Linux 系統裡面看到的時區則停在 CST(GMT+8). 此時回到 Linux 系統, 使用 "set" command 查詢系統參數, 會看到 TZ='Asia/Taipei'.

也就是說, #4 即使 setenv(), 也僅作用於 deamon, Linux 系統卻沒有跟著變動.
怪異的是, #1 的 setenv(), 則會作用在 Linux 系統. 因為當我把 setenv() 拿掉的時候, Linux 系統中的 TZ, 就都不會存在.

我的猜測是, 系統設定值在每個 process 應該是獨立的? 可是這樣無法說明為什麼 #1 的 setenv() 會波及 Linux 系統.

沒有留言:

張貼留言