如何使用Python获取系统NTP同步状态及已同步的NTP服务器源信息
解决方案
实现思路
- 你之前用到的
org.freedesktop.timedate1D-Bus接口本身就可以直接获取NTP服务启用状态、是否同步成功两个核心状态 - 如果你的系统用默认的
systemd-timesyncd作为NTP客户端(绝大多数带systemd的Linux发行版默认配置),可以直接访问org.freedesktop.timesync1的D-Bus接口获取当前同步的服务器地址,完全不需要依赖外部工具
完整代码示例
import pydbus # 连接系统总线 system_bus = pydbus.SystemBus() # 获取timedate1对象,读取基础NTP状态 timedated = system_bus.get(".timedate1") ntp_enabled = timedated.NTPEnabled ntp_synced = timedated.NTPSynchronized print(f"NTP服务状态:{'已启用' if ntp_enabled else '已禁用'}") print(f"NTP同步状态:{'已同步' if ntp_synced else '未同步'}") # 同步成功时读取当前使用的NTP服务器地址 if ntp_synced: try: # 访问systemd-timesyncd的D-Bus接口 timesyncd = system_bus.get("org.freedesktop.timesync1", "/org/freedesktop/timesync1") server_addr = timesyncd.CurrentServerAddress # 字节数组转标准IP字符串格式 if len(server_addr) == 4: ip_str = ".".join(str(b) for b in server_addr) else: # IPv6地址转换 ip_str = ":".join(f"{server_addr[i]:02x}{server_addr[i+1]:02x}" for i in range(0, 16, 2)) print(f"已同步到NTP服务器({ip_str})") except Exception: # 非systemd-timesyncd场景兜底,读取NTP配置文件拿配置的源列表 for config_path in ["/etc/chrony.conf", "/etc/ntp.conf", "/etc/systemd/timesyncd.conf"]: try: with open(config_path, "r") as f: servers = [] for line in f: line = line.strip() if not line or line.startswith("#"): continue if line.startswith(("server ", "pool ", "NTP=")): servers.append(line.split()[1] if "=" not in line else line.split("=")[1]) if servers: print(f"当前配置的NTP源列表:{'、'.join(servers)}") break except: continue else: print("无法识别当前NTP客户端,暂无法读取NTP源信息")
注意事项
- 上述代码仅依赖
pydbus库,不需要系统安装ntpstat、chronyc等任何NTP相关的命令行工具 - 如果你的系统使用chrony、ntpd等非默认NTP客户端,也可以根据实际客户端类型调整配置文件解析逻辑,不需要额外依赖
内容的提问来源于stack exchange,提问作者BDubs
相关产品推荐
相关产品推荐

