Як перевірити, чи 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 зазвичай не робиться"; каталог сценаріїв всередині ntp tarball вказує на протилежний висновок.
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. І хотів перевірити значення повернення (можливо, я буду використовувати функцію системи ("оболонки оболонки")). Ваша відповідь дає мені думку про те, що ми не повинні встановлювати інтервал для NTPD і про всяк випадок, я хочу змінити NTP-сервер, мені доведеться редагувати файл ntp.conf. Скажіть, як ntpd працює з сервером ntp. Чи потрібно перезапускати демон ntpd після редагування файлу ntp.conf (знову за допомогою сценарію оболонки )
бачить

ntpd - це демон-процес - він працює постійно. Він визначає, як часто запитувати сервер на поточний час, а також як часто і на скільки міняти локальний годинник, виходячи з того, як рухається місцевий годинник: ви не можете реально контролювати жоден з інтервалів. ntpd працює у фоновому режимі. Щоб змінити NTP-сервер, ви відредагуйте /etc/ntp.conf і зупиніться, а потім запустіть ntpd.
Брюс Едігер

Я також повинен зазначити, що опублікований вами фрагмент коду повинен запускатися на рівні вище 3 або під час завантаження. ntpdate встановлює системний годинник, тоді ntpd стає демоновим процесом і підтримує синхронізацію годинника з серверами. Зазвичай ви не запускаєте ці 2 рядки коду, щоб просто "встановити годинник".
Брюс Едігер

Зрозумів. Як щодо 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, був непридатним для великого зміщення (більше 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 }'

Кількість однорангових НТП може бути отримана за допомогою наступного конвеєра UNIX:

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

Для компенсації NTP ми використовуємо:

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

Для підрахунку рівних NTP ми використовуємо:

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

Конфігурація моніторингу NTP, готової Zabbix (джерело: 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

Чому я вважаю, що хронічний - це добре: він був попередньо встановлений на моїй машині Fedora, і я ніколи не мав жодних проблем з цим (використовував його вже багато років). У мене ніколи не було проблем з ntpd, але якщо ви читаєте на наданому посиланням, є деяка інформація про те, чому хроніка краще не завжди на машинах. Ось чому я запропонував оператору спробувати його, це може, а може, і не спрацює краще. Тож це просто ще один хороший варіант спробувати, перш ніж вдаватися до занадто великої настройки, оптимізації та злому ntpd.


1
будь ласка, прокоментуйте, якщо ви виступаєте з раціональним
akostadinov

Чому ти вважаєш, що хронія краще?
dfc

@dfc, він був попередньо встановлений на моїй машині Fedora, і я ніколи не мав жодних проблем з ним (використовував його вже роками). У мене ніколи не було проблем з ntpd, але якщо ви читаєте на наданому посиланням, є деяка інформація про те, чому хроніка краще не завжди на машинах. Ось чому я запропонував ОП спробувати його, це може, а може, і не спрацює краще. Тож це просто ще один хороший варіант спробувати, перш ніж вдаватися до занадто великої настройки, оптимізації та злому ntpd.
акостадінов

Швидше додайте цю інформацію у сам відповідь. Це досить цінно, і ви просто можете отримати зворотний голос.
thepang

Зважаючи на те, що ваша відповідь не відповідає актуальному запитанню, на мою думку, чи краще підходити до коментаря до цього питання.
Хайме Хаблуцель

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.