运行 chrony 步进时钟时的脚本
run script when chrony steps clock
我需要启动某个服务在系统时钟被crony正确调整后。
系统时间由 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 可以在 stratus 级别发生变化时调用脚本,但我找不到参考资料。
无论如何:
有什么方法可以指示裙带 运行 一个 script/program 或以其他方式在 acquires/loses 跟踪有效服务器时发送一些信号?
我目前依赖于一个相当丑陋的:while chronyc tracking | grep -q "Not synchronised"; do sleep 1; done
,但是 chronyd
的主动信号将是首选。
详情:
- 系统是一个(相对)小型物联网设备 运行ning Linux (Yocto)
- 它没有 RTC(它始终以时钟设置为 Epoch 开始)。
- 系统没有连接到 Internet(最初)。
- 系统已连接到具有 GNSS 的设备
接收器和正确的时间是从那里导出的。
- GNSS 获取定位点之前可能需要很长时间(有时 'very'),因此可以传播时间。
- 在某个时刻,chrony 终于得到了正确的时间
和步骤系统时钟。完成后我需要启动一个服务
(或 运行 脚本或其他)。
- 我目前正在轮询
chronyc tracking
和解析状态,但这不是很好。
建议调查 systemd-time-wait-sync.service
here。
建议的技术是使用 systemd
等待 systemd-time-wait-sync.service
同步内核时钟的服务单元。
描述了这些技术
我也想做同样的事情,然后想出了 empty-handed。
不过,我确实找到了 chronyc waitsync
,这似乎是一种 built-in 进行轮询的方式,无需显式解析和休眠。这对我来说效果很好,因为我只需要延迟一个 start-up 动作。
此命令的存在还提示(尽管绝不能证明)可能不支持直接触发。如果触发是硬性要求,rsyslogd
can help.
顺便说一句,只能佩服 systemd 粉丝的热情,即使他们声称的答案显然完全无关紧要,也要传播爱。
显然,目标系统不使用 systemd
。问题是关于 chronyd
, 而不是 关于 systemd-timesyncd
,而 systemd-time-wait-sync.service
仅适用于后者。
我需要启动某个服务在系统时钟被crony正确调整后。
系统时间由 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 可以在 stratus 级别发生变化时调用脚本,但我找不到参考资料。
无论如何: 有什么方法可以指示裙带 运行 一个 script/program 或以其他方式在 acquires/loses 跟踪有效服务器时发送一些信号?
我目前依赖于一个相当丑陋的:while chronyc tracking | grep -q "Not synchronised"; do sleep 1; done
,但是 chronyd
的主动信号将是首选。
详情:
- 系统是一个(相对)小型物联网设备 运行ning Linux (Yocto)
- 它没有 RTC(它始终以时钟设置为 Epoch 开始)。
- 系统没有连接到 Internet(最初)。
- 系统已连接到具有 GNSS 的设备 接收器和正确的时间是从那里导出的。
- GNSS 获取定位点之前可能需要很长时间(有时 'very'),因此可以传播时间。
- 在某个时刻,chrony 终于得到了正确的时间 和步骤系统时钟。完成后我需要启动一个服务 (或 运行 脚本或其他)。
- 我目前正在轮询
chronyc tracking
和解析状态,但这不是很好。
建议调查 systemd-time-wait-sync.service
here。
建议的技术是使用 systemd
等待 systemd-time-wait-sync.service
同步内核时钟的服务单元。
我也想做同样的事情,然后想出了 empty-handed。
不过,我确实找到了 chronyc waitsync
,这似乎是一种 built-in 进行轮询的方式,无需显式解析和休眠。这对我来说效果很好,因为我只需要延迟一个 start-up 动作。
此命令的存在还提示(尽管绝不能证明)可能不支持直接触发。如果触发是硬性要求,rsyslogd
can help.
顺便说一句,只能佩服 systemd 粉丝的热情,即使他们声称的答案显然完全无关紧要,也要传播爱。
显然,目标系统不使用 systemd
。问题是关于 chronyd
, 而不是 关于 systemd-timesyncd
,而 systemd-time-wait-sync.service
仅适用于后者。