Как проверить, успешно ли NTPD обновляет время машины с помощью оболочки?


21

Я пытаюсь использовать NTPD для обновления времени моего компьютера с Linux на указанный NTP-сервер.
Вот сценарий:

Каждый раз, когда машина Linux запускается, я хочу обновить время с NTP-сервера, и если это не удастся, я хочу повторить попытку каждые 5 минут до успешного завершения (макс. 2 часа).

Я искал вокруг и обнаружил, что я должен (?) Использовать NTPD и использовать некоторые команды, такие как:

#ntpdate ntp.server.com (до запуска NTPD)
#ntpd some_options_to_start

Вопросы:

  1. Как я могу узнать, было ли время успешно обновлено этими командами?
  2. Могу ли я установить интервал обновления времени с ntpd? (или я должен использовать что-то вроде sleepи цикл с do.. while/ forв оболочке?)

Обратите внимание, что я хочу выполнить вышеупомянутые команды в сценарии оболочки и поместит оболочку на веб-сервер. Затем клиенты (с браузером веб-браузера) выполнят скрипт на сайте. Поэтому мне нужно проверить, было ли обновление успешным или нет, чтобы отправить результат клиенту (через Интернет).

Ответы:


22

Использование сценария для мониторинга ntpdобычно не делается. Обычно инструмент мониторинга, такой как nagiosили muninиспользуется для мониторинга демона. Инструмент может отправить вам уведомление, когда что-то пойдет не так. Я muninпишу мне, если смещение превышает 15 миллисекунд.

Обычно вы должны использовать нечетное количество серверов, чтобы демон мог выполнить выбор между серверами, если он отключится. Три обычно достаточно, а более пяти - чрезмерно. Клиенты вашей внутренней сети должны иметь возможность обойтись с одним внутренним сервером, если вы его контролируете. Используйте легальные серверы или NTP или DNS-серверы вашего интернет-провайдера в качестве источников синхронизации. Есть публичные пулы, а также публичные серверы.

ntpdявляется самонастраивающимся, и вам не нужно настраивать его после его настройки и запуска. В последних ntpdреализациях вы можете полностью отказаться от использования, так ntpdateкак они могут выполнять начальную настройку даты.

Следующий скрипт проанализирует смещения в выводе ntpd и сообщит о чрезмерном смещении. Вы можете запустить его из cron, чтобы отправить вам электронное письмо в случае возникновения проблем. Сценарий по умолчанию оповещает о смещении в 0,1 секунды.

#!/bin/bash
limit=100   # Set your limit in milliseconds here
offsets=$(ntpq -nc peers | tail -n +3 | cut -c 62-66 | tr -d '-')
for offset in ${offsets}; do
    if [ ${offset:-0} -ge ${limit:-100} ]; then
        echo "An NTPD offset is excessive - Please investigate"
        exit 1  
    fi  
done
# EOF

Это первый случай, когда я слышал о том, кто контролирует системное время. Отличный ответ.
Брюс Эдигер

@BillTHor: Отличный ответ. Большое спасибо. Попробую применить его к моей текущей работе
увидит

@BruceEdiger Я так понимаю, вы никогда не слышали о людях из списка рассылки времени.
DFC

Что касается «Использование сценария для мониторинга ntpd обычно не делается»; каталог scripts внутри архива ntp указывает на противоположный вывод.
DFC

@dvc Сценарии там не включают запрошенную функциональность. Кажется, есть некоторый код для генерации SNMP-ловушек, но я не встречал SNMP для мониторинга NTP. Я должен был сделать свой собственный мониторинг в нескольких крупных организациях.
BillThor

8

Используйте ntpstat.

myserver # ntpstat
synchronised to NTP server (10.89.160.13) at stratum 4
   time correct to within 124 ms
   polling server every 1024 s

1
В Ubuntu 16.04 я обнаружил, что глючит ntpstat. После отключения сетевого кабеля он все еще показывался как синхронизированный с состоянием возврата 0, хотя не ntpq -pпоказывал одноранговых узлов. Так что я не доверяю этой утилите.
Гюйгенс

8

Чтобы ответить на первый вопрос, ntpdateобычно рассказывается, что он сделал, а может, и не сделал.

[root@flask rc.d]# ntpdate dagoo
12 Aug 10:04:03 ntpdate[20585]: adjust time server 10.0.0.15 offset -0.042285 sec

Демон NTP ntpd, работает постоянно и время от времени запрашивает у серверов NTP (обычно настроенных в /etc/ntp.conf) время. Вам не нужно запускать скрипт каждые 5 минут. ntpdateдолжен привести машину в режим почти синхронизации с сервером, и он ntpdбудет работать в фоновом режиме и поддерживать его синхронизацию. Вы не устанавливаете интервал, который пытается использовать ntpd, он регулирует интервал на основе того, как он воспринимает смещение локальных часов от серверов, и качества соединений с серверами.

Вы можете использовать программу с именем, ntpdcчтобы увидеть, что ntpdхранится в качестве информации:

1 % ntpdc 
ntpdc> peers
     remote           local      st poll reach  delay   offset    disp
=======================================================================
*min-time-01.ine 10.0.0.15        1 1024  377 0.07047  0.014673 0.14360
=dns-01.esd189.o 10.0.0.15        2 1024  377 0.07587  0.022277 0.13660
ntpdc>

Я думаю, что число, которое вас обычно интересует, это «смещение», то есть количество секунд, в течение которых ваши локальные часы отключены от часов сервера.

В качестве manстраницы ntpdcсостояний для команды "peers":

the current estimated delay, offset and dispersion of the peer, all in seconds.

Итак, ясно, что «смещение» в секундах.

Похоже, что ntpdcустарела, заменена на ntpq. ntpqимеет интерактивную команду "peers", которая дает "смещение" в миллисекундах. Мой Redhat сервер имеет и то ntpdcи другое ntpq, так что вам нужно быть осторожным.


Большой! Но в моем вопросе есть неясная часть. Я собираюсь выполнить сценарий оболочки в C-программе. И хотел проверить возвращаемое значение (возможно, я воспользуюсь функцией system ("shellscript")). Ваш ответ дает мне представление, что мы не должны устанавливать интервал для NTPD, и на всякий случай, я хочу изменить NTP-сервер, мне нужно отредактировать файл ntp.conf. Не могли бы вы рассказать мне, как ntpd работает с сервером ntp. Должен ли я перезапустить демон пЪрд после редактирования файла ntp.conf (снова используя скрипт )
видит

ntpd - это процесс-демон - он работает непрерывно. Он решает, как часто запрашивать у сервера текущее время, а также как часто и сколько нужно менять локальные часы, исходя из того, как смещаются локальные часы: вы не можете контролировать ни один из интервалов. Ntpd работает в фоновом режиме. Чтобы изменить NTP-сервер, вы редактируете /etc/ntp.conf и останавливаетесь, затем запускаете ntpd.
Брюс Эдигер

Я должен также упомянуть, что фрагмент кода, который вы разместили, должен запускаться на уровне запуска 3 или выше во время загрузки. ntpdate устанавливает системные часы, затем ntpd становится процессом-демоном и синхронизирует часы с серверами. Обычно вы не запускаете эти две строки кода, чтобы просто «установить часы».
Брюс Эдигер

Я понял. Как насчет ntpdate, когда он получает неправильный ntpserver (например) и работает неправильно? Как я могу узнать это по сценариям оболочки?
видит

7

ntp-wait был сделан для этой проблемы.

Пять минут с, man ntp-waitи вы должны быть в рабочем состоянии ...


Я нашел ntp-wait в Debian, но не в Centos. пожалуйста помоги !
Массимо

2

Я добавил в сценарий @BillTHor bash также проверку кода завершения ntpdstat> 0:

#!/bin/bash
ntpstat > /dev/null
if [ $? -ne 0 ]; then
        echo "NTPD not synchronized - Please investigate"
        exit 1
fi
limit=1000   # Set your limit in milliseconds here
offsets=$(ntpq -nc peers | tail -n +3 | cut -c 62-66 | tr -d '-')
for offset in ${offsets}; do
    if [ ${offset:-0} -ge ${limit:-100} ]; then
        echo "An NTPD offset is excessive - Please investigate"
        exit 1
    fi
done
# EOF

[ОБНОВЛЕНИЕ], так как скрипт, использующий вывод ntpq, был бесполезен для смещения larget (более 4 цифр смещения), я пробовал новую версию, используя только ntpstat:

#!/bin/bash
ntpstat > /dev/null
if [ $? -gt 0 ]; then
        echo "NTPD not synchronized - Please investigate"
        exit 1
fi
limit=1000   # Set your limit in milliseconds here
#offsets=$(ntpq -nc peers | tail -n +3 | cut -c 62-66 | tr -d '-')
#offsets=$(ntpq -nc peers | tail -n +3 | tr -s ' ' | cut -d ' ' -f 9 | tr -d '-' |tr -d '.')
offsets=$(ntpstat | tail -n +2 | head -n 1 | cut -c 27- | tr -d ' ms')
for offset in ${offsets}; do
    if [ ${offset:-0} -ge ${limit:-100} ]; then
        echo "NTPD offset is excessive: ${offset:-0} [ms] > ${limit:-100} [ms] - Please investigate"
        exit 1
    fi
done
# EOF`enter code here`

2

Смещение NTP можно получить с помощью следующего конвейера UNIX:

/usr/sbin/ntpq -pn | /usr/bin/awk 'BEGIN { offset=1000 } $1 ~ /^\*/ { offset=$9 } END { print offset }'

Число пиров NTP можно получить с помощью следующего конвейера UNIX:

/usr/sbin/ntpq -pn | egrep -c '^\*|^\+'

Для NTP offet мы используем:

  • предупреждение> 250 мс
  • критический> 500 мс

Для подсчета пиров NTP мы используем:

  • нет порога предупреждения
  • критический <1

Zabbix-готовый NTP-мониторинг (источник: Joyent):

# NTP
UserParameter=ntp.offset,/usr/sbin/ntpq -pn | /usr/bin/awk 'BEGIN { offset=1000 } $1 ~ /^\*/ { offset=$9 } END { print offset }'
UserParameter=ntp.peers,/usr/sbin/ntpq -pn | egrep -c '^\*|^\+'

Подключаемые модули мониторинга NTP для Nagios:

check_ntp_offset:

#!/bin/bash
# thresholds
thresh_warn=250
thresh_crit=500

# metric
ntp_offset=$(/usr/sbin/ntpq -pn | /usr/bin/awk 'BEGIN { offset=1000 } $1 ~ /^\*/ { offset=$9 } END { print offset }')

# Exit codes
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3

if [[ ! "$ntp_offset" =~ ^[0-9]+$ ]] ; then
   # NTP offset could not be read successfully
   echo "NTP OFFSET UNKNOWN - $ntp_offset"
   exit $STATE_UNKNOWN
elif [[ "$ntp_offset" -gt "$thresh_crit" ]] ; then
   # NTP offset is higher than the critical threshold
   echo "NTP OFFSET CRITICAL - ${ntp_offset}ms (> ${thresh_crit}ms)"
   exit $STATE_CRITICAL
elif [[ "$ntp_offset" -gt "$thresh_warn" ]] ; then
   # NTP offset is higher than the warning threshold
   echo "NTP OFFSET WARNING - ${ntp_offset}ms (> ${thresh_warn}ms)"
   exit $STATE_WARNING
else
   # NTP offset is within thresholds
   echo "NTP OFFSET OK - ${ntp_offset}ms (< ${thresh_warn}ms)"
   exit $STATE_OK
fi

check_ntp_peers:

#!/bin/bash
# thresholds
thresh_warn=1
thresh_crit=1

# metric
ntp_peers=$(/usr/sbin/ntpq -pn | egrep -c '^\*|^\+')

# Exit codes
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3

if [[ ! "$ntp_peers" =~ ^[0-9]+$ ]] ; then
   # NTP peers could not be read successfully
   echo "NTP PEERS UNKNOWN - $ntp_peers"
   exit $STATE_UNKNOWN
elif [[ "$ntp_peers" -lt "$thresh_crit" ]] ; then
   # NTP peers is lower than the critical threshold
   echo "NTP PEERS CRITICAL - $ntp_peers (< $thresh_crit)"
   exit $STATE_CRITICAL
elif [[ "$ntp_peers" -lt "$thresh_warn" ]] ; then
   # NTP peers is lower than the warning threshold
   echo "NTP PEERS WARNING - $ntp_peers (< $thresh_warn)"
   exit $STATE_WARNING
else
   # NTP peers is within thresholds
   echo "NTP PEERS OK - $ntp_peers (> $thresh_warn)"
   exit $STATE_OK
fi

Я действительно должен позволить настраивать предупреждения и критические пороговые значения в сценариях Nagios с помощью -w и -c. Они не совсем готовы к плагину без этого. Дальнейшее руководство по этому вопросу в учебном руководстве здесь: http://www.kernel-panic.it/openbsd/nagios/nagios6.html


1

Считается, что Chrony обрабатывает ваш вариант использования лучше, чем NTPd (сеть и машина вкл / выкл, приостановка и т. Д.). Видеть

http://fedoraproject.org/wiki/Features/ChronyDefaultNTP

RE, почему я считаю, что chronny хорош: он был предварительно установлен на моей машине Fedora, и у меня никогда не было с этим проблем (я использовал его уже много лет). У меня никогда не было проблем с ntpd и в прошлом, но если вы прочитаете ссылку, которую я предоставил, есть некоторая информация о том, почему chrony лучше не всегда на машинах. Вот почему я предложил опе попробовать, это может или не может работать лучше для него. Так что это просто еще один хороший вариант, прежде чем начинать слишком много настройки, оптимизации и взлома ntpd.


1
Прокомментируйте, пожалуйста, если вы понизили со своим рациональным
akostadinov

Как вы думаете, почему хрония лучше?
2009 г.

@dfc, он был предустановлен на моей машине fedora, и у меня никогда не было с этим проблем (я использовал его уже много лет). У меня никогда не было проблем с ntpd и в прошлом, но если вы прочитаете ссылку, которую я предоставил, есть некоторая информация о том, почему chrony лучше не всегда на машинах. Вот почему я предложил опе попробовать, это может или не может работать лучше для него. Так что это просто еще один хороший вариант, прежде чем начинать слишком много настройки, оптимизации и взлома ntpd.
Акостадинов

Скорее добавьте эту информацию в ответ. Это достаточно ценно, и вы можете просто поменять голос.
Чепанг

Учитывая, что ваш ответ не соответствует реальному вопросу, на мой взгляд, он лучше подходит для того, чтобы комментировать вопрос.
Хайме Хаблутцель

1
#!/bin/bash

limit=100   # Set your limit in milliseconds here

offsets=$(ntpq -nc peers | tail -n +3 | awk '{print $9 }' | tr -d '-')

for offset in ${offsets}; 
do

    if [ ${offset:-0} -ge ${limit:-100} ];
    then
        echo "An NTPD offset is excessive - Please investigate"

        exit 1

    fi  
done

0
#!/usr/bin/bash
#set -x
NTPLIMIT=100   # Set your NTPLIMIT in milliseconds here
offsets=$(ntpq -nc peers | tail -3 | cut -c 62-66 | tr -d '-')
for offset in ${offsets}; do
    if [ ${offset:-0} -ge ${NTPLIMIT:-100} ]; then
        echo "An NTPd offset is excessive Please investigate" exit;
        else
                echo "NTP is within 0.1 second of time server"
                exit;
        fi
done

То же, что и в предыдущем ответе выше, но с небольшим изменением, так как предыдущая команда будет запускать оператор if для стольких смещений, т.е. если смещение равно 3, то оно будет печатать NTP в пределах 0,1 ... 3 раза до закрытия. Может быть раздражает, если у вас есть сервер, который находится далеко от синхронизации. Вероятно, есть способ удалить цикл for ...

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.