如何检查我的系统时钟是否与 NTP 服务器同步?

How do I check whether my system's clock is synchronized to a NTP server?

我在 Linux 系统(Ubuntu 服务器)上有一个应用程序需要知道当前系统时钟是否已同步到 NTP 服务器。虽然我可以检查 timedatectlSystem clock synchronized: yes 输出,但这看起来非常脆弱,特别是因为 timedatectl 的人类可读输出将来可能会发生变化。

然而,systemd 似乎充满了 DBus 接口,所以我怀疑可能有一种方法可以在那里检查。无论哪种方式,我都在寻找 bool is_ntp_synchronized().

有什么方法可以简单地检查系统时钟是否同步而无需启动另一个进程?

Linux 提供 adjtimex, which also gets used by systemd。您可以检查各个字段以确定您是否仍处于同步状态。不等于 TIME_ERROR 的非负 return 值可能是您的强项,尽管您可以使用 maxerror 或其他字段来检查时钟的质量。

#include <stdio.h>
#include <sys/timex.h>

int main()
{
    struct timex timex_info = {};
    timex_info.modes = 0;         /* explicitly don't adjust any time parameters */

    int ntp_result = ntp_adjtime(&timex_info);

    printf("Max       error: %9ld (us)\n", timex_info.maxerror);
    printf("Estimated error: %9ld (us)\n", timex_info.esterror);
    printf("Clock precision: %9ld (us)\n", timex_info.precision);
    printf("Jitter:          %9ld (%s)\n", timex_info.jitter,
           (timex_info.status & STA_NANO) ? "ns" : "us");
    printf("Synchronized:    %9s\n", 
           (ntp_result >= 0 && ntp_result != TIME_ERROR) ? "yes" : "no");
    return 0;
}

请注意 systemd explicitly ignores 报告的结果(错误除外),而是检查 timex_info.maxerror 值是否未超过 16 秒。

这个界面也已经provided since the pre-git times了。因此,它保证是稳定的,否则它可能会破坏 Linux 的 don't-break-userspace-policy。