Linux 服務器(或 Docker 容器)修改時間、時間同步、只修改某應用的時間(時光旅行測試)


一、設置時間

date --set '2015-11-23 0:10:40'  # 方法一,通用
timedatectl set-time '2015-11-23 08:10:40'  # 容器內可能不支持

二、設置時區

# 方法一,通用
# 對容器而言,也可以直接將宿主機的下面倆文件映射到容器內
# 或者有的容器支持使用環境變量
/bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' >/etc/timezone

# 方法二,容器內可能不支持
timedatectl set-timezone UTC

三、同步時間(一次性)

Alpine Linux: ntpd -d -q -n -p ntp3.aliyun.com,立即同步時間,不限制同步間隔

CentOS/Ubuntu:

sudo apt-get install ntpdate  # 或者 yum
ntpdate ntp3.aliyun.com

國內公共 ntp 服務器:

  1. 國家授時中心:ntp.ntsc.ac.cn
  2. 阿里雲:ntp3.aliyun.com

四、時間同步服務(常駐后台)

建議用 chronyd,有 docker 的可以跑容器版本的 chronyd

五、只修改應用本身的時間:libfaketime

這種需求常見於時光旅行測試(Time-Travel Testing),需要修改應用的時間,以確認與時間相關的邏輯是否正確(比如訂單是否過期之類的)。

為了不影響系統上別的軟件,最好是只修改應用本身的時間,不會影響操作系統全局。比如對運行在 kubernetes 集群上的一套微服務進行時光旅行 API 測試,修改(節點)操作系統的時間很可能會導致集群節點故障。

libfaketime 可以通過環境變量 FAKETIME 很方便的設置 fake 的 time,而不影響系統上其他環境的應用。這可以保證別的程序不受系統時間躍遷的影響。

我實際測試這個庫后發現:

  1. libfaketime 設置時間默認有 10s 的緩存,可通過設置環境變量 `FAKETIME_CACHE_DURATION 進行修改。參見 Time modification does not take effect immediately
  2. Python 能直接通過修改環境變量 FAKETIME 達到修改時間的目的。
  3. Dotnet 設置的環境變量 FAKETIME 對 libfaketime 無效,這可能和 dotnet 自身的環境變量模型有關。
    • dotnet 需要通過將參數寫入 /etc/faketimerc$HOME/.faketimerc 修改時間。
  4. docker+dotnet+libfaketime 測試,發現性能問題比較嚴重。

修改環境變量的方法很方便,但不適合用於進程間相互修改時間(比如我 ssh 進容器改容器時間),有時可能會失效。而寫入配置文件的方法可以跨進程通信,更可靠。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM