#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 «не нарушать пользовательское пространство».