Как мне проверить, синхронизированы ли часы моей системы с сервером NTP?

#c #linux #ntp

#c #linux #ntp

Вопрос:

У меня есть приложение в системе Linux (сервер Ubuntu), которому необходимо знать, синхронизированы ли текущие системные часы с сервером NTP. Хотя я мог бы проверить timedatectl вывод System clock synchronized: yes , это кажется очень хрупким, тем более timedatectl , что вывод, читаемый человеком, может измениться в будущем.

Однако systemd, похоже, полон интерфейсов DBus, поэтому я подозреваю, что там может быть способ проверить. В любом случае, я ищу bool is_ntp_synchronized() .

Есть ли какой-либо способ просто проверить, синхронизированы ли системные часы, не запуская другой процесс?

Комментарии:

1. Примечание: вы хотите знать, синхронизировал ли NTP время или компьютер синхронизировал время с сервером? [для первого: вы можете использовать аппаратные средства (например, GPS-часы), подключенные к демону NTP. во-вторых, в прошлом мы ntpdate вызывали регулярно, но не запускали демон ntp].

Ответ №1:

Linux предоставляет adjtimex , который также используется systemd . Вы можете проверить различные поля, чтобы определить, синхронизированы ли вы по-прежнему. Неотрицательное возвращаемое значение, неравное TIME_ERROR , может быть вашей сильной стороной, хотя вместо этого вы можете использовать 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(amp;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 amp; STA_NANO) ? "ns" : "us");
    printf("Synchronized:    %9sn", 
           (ntp_result >= 0 amp;amp; ntp_result != TIME_ERROR) ? "yes" : "no");
    return 0;
}
 

Обратите внимание, что это systemd явно игнорирует сообщаемый результат (за исключением ошибок) и вместо этого проверяет, что timex_info.maxerror значение не превысило 16 секунд.

Этот интерфейс также был предоставлен со времен, предшествовавших git. Таким образом, гарантируется, что он будет стабильным, поскольку в противном случае это может нарушить политику Linux «не нарушать пользовательское пространство».