【问题标题】:run script when chrony steps clock当chrony步时钟运行脚本
【发布时间】:2021-12-01 10:38:10
【问题描述】:

我需要系统时钟被裙带正确步进后启动某个服务。

系统时间由 chrony (chronyd (chrony) version 3.5 (+CMDMON +NTP +REFCLOCK +RTC -PRIVDROP -SCFILTER -SIGND +ASYNCDNS -SECHASH +IPV6 -DEBUG)) 维护。

Chrony 设置(如果相关)是:

server 192.168.100.1 trust minpoll 2 maxpoll 4 polltarget 30
refclock PPS /dev/pps0 refid KPPS trust lock GNSS maxdispersion 3 poll 2
refclock SOCK /var/run/chrony.sock refid GNSS maxdispersion 0.2 noselect
makestep 0.1 -1
driftfile /var/lib/chrony/drift
rtcsync

“正常,跟踪状态”的示例是:

/ # chronyc tracking
Reference ID    : C0A86401 (192.168.100.1)
Stratum         : 2
Ref time (UTC)  : Wed Dec 01 11:52:08 2021
System time     : 0.000004254 seconds fast of NTP time
Last offset     : +0.000000371 seconds
RMS offset      : 0.000011254 seconds
Frequency       : 17.761 ppm fast
Residual freq   : +0.001 ppm
Skew            : 0.185 ppm
Root delay      : 0.000536977 seconds
Root dispersion : 0.000051758 seconds
Update interval : 16.2 seconds
Leap status     : Normal

而“未同步”(初始)状态为:

/ # chronyc tracking
Reference ID    : 00000000 ()
Stratum         : 0
Ref time (UTC)  : Thu Jan 01 00:00:00 1970
System time     : 0.000000000 seconds fast of NTP time
Last offset     : +0.000000000 seconds
RMS offset      : 0.000000000 seconds
Frequency       : 0.000 ppm slow
Residual freq   : +0.000 ppm
Skew            : 0.000 ppm
Root delay      : 1.000000000 seconds
Root dispersion : 1.000000000 seconds
Update interval : 0.0 seconds
Leap status     : Not synchronised

我似乎记得 crony 可以在层级变化时调用脚本,但我找不到参考。

无论如何: 是否有任何方法可以指示 crony 运行脚本/程序或以其他方式在获取/丢失与有效服务器的跟踪时发送一些信号?

我目前依赖的是一个相当丑陋的:while chronyc tracking | grep -q "Not synchronised"; do sleep 1; done,但chronyd 的主动信号将是首选。

详情:

  • 系统是运行 Linux (Yocto) 的(相对)小型物联网设备
  • 它没有 RTC(它总是从设置为 Epoch 的时钟开始)。
  • 系统未连接到 Internet(最初)。
  • 系统已连接到具有 GNSS 的设备 接收器和正确的时间是从那里得出的。
  • 在 GNSS 获得定位并因此可以传播时间之前,可能需要(有时“非常”)很长时间。
  • 在某个时刻,chrony 终于找到了正确的时间 并步进系统时钟。完成后我需要启动一个服务 (或运行脚本或其他)。
  • 我目前正在轮询chronyc tracking 并解析状态,但这并不是很好。

【问题讨论】:

    标签: linux systemd chrony


    【解决方案1】:

    我也想做同样的事情,结果空手而归。

    不过,我确实找到了chronyc waitsync,这似乎是一种内置的轮询方式,无需显式解析和休眠。这对我的情况来说已经足够好了,因为我只需要延迟一个启动操作。

    这个命令的存在也提示(尽管不能证明)可能不支持直接触发。如果触发是硬性要求,rsyslogdcanhelp


    顺便说一句,我们只能佩服系统粉丝的热情,即使他们声称的答案显然完全无关紧要,也要传播爱。

    显然,目标系统不使用systemd。问题是关于chronyd不是关于systemd-timesyncd,而systemd-time-wait-sync.service 仅适用于后者。

    【讨论】:

      【解决方案2】:

      建议在here中调查systemd-time-wait-sync.service

      建议的技术是使用等待systemd-time-wait-sync.servicesystemd 服务单元来同步内核时钟。

      在服务单元文件或管道中使用after 命令。 这些技术被描述为herehere

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-05
        相关资源
        最近更新 更多