在系统时钟被裙带正确步进后,我需要启动某个服务。
系统时间由 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 的时钟开始)。
- 系统没有连接到互联网(最初)。
- 系统已连接到具有 GNSS 接收器的设备,并且从那里得出正确的时间。
- 在 GNSS 获得定位并因此可以传播时间之前,可能需要(有时“非常”)很长时间。
- 在某个时刻,chrony 最终获得了正确的时间并步入系统时钟。完成此操作后,我需要启动服务(或运行脚本或其他)。
- 我目前正在轮询
chronyc tracking
和解析状态,但这并不是很好。