zoukankan      html  css  js  c++  java
  • 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 进容器改容器时间),有时可能会失效。而写入配置文件的方法可以跨进程通信,更可靠。

  • 相关阅读:
    浅谈 unix, linux, ios, android 区别和联系
    比 Java 更具争议的 PHP,处处留坑?
    JavaScript 对象
    前端:for、foreach、for in、for of、$.each、$().each的区别
    java按照关键字指定的key删除redis(支持模糊删除)
    单点登录SSO
    页面打印的总结
    Jquery对selec操作的总结
    JS判断操作系统
    动态生成js的正则,替换字符串
  • 原文地址:https://www.cnblogs.com/kirito-c/p/11718537.html
Copyright © 2011-2022 走看看