如何配置chrony在系统时钟同步跳变后自动触发执行自定义脚本
解决方案
方案1:使用chrony原生runonchange主动触发(推荐)
你使用的chrony 3.5版本原生支持runonchange配置指令,无需轮询,可在时间调整或同步状态变更时主动触发指定脚本/命令:
- 编辑chrony配置文件(通常为
/etc/chrony.conf),添加如下配置,阈值可根据你的makestep 0.1规则调整为0.05秒即可覆盖所有跳变场景:
runonchange 0.05 /usr/local/bin/chrony_sync_hook.sh
- 编写触发脚本
/usr/local/bin/chrony_sync_hook.sh,可按需补充同步状态判断、单次执行锁等逻辑避免重复触发:
#!/bin/bash # 首次同步完成标记文件 LOCK_FILE="/var/run/chrony_first_sync_done" [ -f "$LOCK_FILE" ] && exit 0 # 判断当前是否已完成有效同步 if chronyc tracking | grep -q "Leap status *: *Normal"; then # 替换为你要启动的服务或执行的自定义逻辑 systemctl start your-target.service # 标记首次同步完成,后续时间调整不会再触发逻辑 touch "$LOCK_FILE" fi
- 赋予脚本执行权限,重启chronyd服务生效:
chmod +x /usr/local/bin/chrony_sync_hook.sh systemctl restart chronyd
方案2:使用chronyc waitsync优化轮询逻辑
如果不需要监听后续同步状态变化,仅需要开机后等待首次同步完成再启动服务,可以使用chrony自带的waitsync命令替代手动轮询,资源占用更低:
在你的目标服务systemd unit文件中添加如下配置即可:
[Unit] After=time-sync.target Wants=time-sync.target [Service] # 0表示永久等待同步完成,适配GNSS长时间搜星场景 ExecStartPre=/usr/bin/chronyc waitsync 0 ExecStart=/path/to/your/service/binary
内容的提问来源于stack exchange,提问作者ZioByte
相关产品推荐
相关产品推荐

