Como verificar se o NTPD atualiza o tempo da máquina com sucesso usando o shell?

20

Estou tentando usar o NTPD para atualizar o tempo da minha máquina Linux para um servidor NTP especificado.
Aqui está o cenário:

Sempre que o computador com Linux é inicializado, quero atualizar o tempo do servidor NTP e se ele não for bem-sucedido, quero tentar novamente a cada 5 minutos até conseguir (o máximo é 2 horas).

Eu procurei em volta e descobri que deveria (?) usar o NTPD e usar algum comando como:

#ntpdate ntp.server.com (antes de iniciar o NTPD)
#ntpd some_options_to_start

As perguntas são:

  1. Como posso saber se o horário foi atualizado com sucesso por esses comandos?
  2. Posso definir o intervalo para atualizar o tempo do ntpd? (ou eu tenho que usar algo como sleep e loop com do .. while / for no shell?)

Note que eu quero executar os comandos acima em um shell script e colocar o shell em um servidor web. Em seguida, os clientes (com um navegador da Web) executarão o script no site. Portanto, preciso verificar se a atualização foi bem-sucedida ou não para enviar o resultado para o cliente (pela web).

    
por sees 12.08.2011 / 17:59

9 respostas

22

O uso de um script para monitorar ntpd não é comumente feito. Normalmente, uma ferramenta de monitoramento como nagios ou munin é usada para monitorar o daemon. A ferramenta pode enviar um alerta quando as coisas dão errado. Eu tenho munin me enviando por e-mail se o deslocamento exceder 15 milissegundos.

Normalmente, você deve usar um número ímpar de servidores para que o daemon possa executar uma eleição entre os servidores, caso algum deles seja desativado. Três é geralmente adequado e mais de cinco é excessivo. Os clientes na sua rede interna devem conseguir se conectar a um servidor interno se você monitorá-lo. Use servidores legítimos ou seus servidores NTP ou DNS de ISPs como fontes de relógio. Existem pools públicos e servidores públicos.

ntpd é auto-ajustável e não é necessário ajustá-lo depois de configurado e iniciado. Com implementações ntpd recentes, você pode descartar o uso de ntpdate totalmente, já que elas podem fazer a configuração inicial da data.

O seguinte script irá analisar os deslocamentos na saída do ntpd e reportar um deslocamento excessivo. Você poderia executá-lo a partir do cron para enviar e-mail se houver problemas. O padrão do script é alertar em um deslocamento de 0,1 segundo.

#!/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
    
por 13.08.2011 / 18:08
8

Use o 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
    
por 30.10.2013 / 21:12
8

Para responder a primeira pergunta, ntpdate geralmente informa o que fez ou talvez não tenha feito.

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

O daemon NTP, ntpd , é executado constantemente e solicita servidores NTP (normalmente configurados em /etc/ntp.conf ) pelo tempo de vez em quando. Você não deveria ter que executar seu script a cada 5 minutos. ntpdate deve aproximar a máquina do servidor e ntpd será executado em segundo plano e mantido em sincronia. Você não define o intervalo que o ntpd tenta, ajusta o intervalo com base em como ele percebe o relógio local dos servidores e a qualidade das conexões com os servidores.

Você pode usar um programa chamado ntpdc para ver o que o ntpd mantém como informações:

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>

Acho que o número em que normalmente você tem interesse é "offset", ou seja, o número de segundos que o relógio local está fora do clock do servidor.

Como a página man para ntpdc indica o comando "peers":

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

Então, claramente, o "deslocamento" está em segundos.

Parece que ntpdc está obsoleto, substituído por ntpq . ntpq tem um comando interativo "peers", que fornece "deslocamento" em milissegundos. Meu servidor Redhat tem ntpdc e ntpq , então você precisa ter cuidado.

    
por 12.08.2011 / 18:09
7

ntp-wait foi feito para esse problema.

Cinco minutos com man ntp-wait e você deve estar em funcionamento ...

    
por 19.10.2011 / 09:53
2

Adicionei ao script @BillTHor bash também uma verificação do código de saída 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

[UPDATE] desde que o script usando saída ntpq foi inútil para o offset de larget (mais de 4 dígitos de offset) Eu tentei uma nova versão usando apenas 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'
    
por 22.01.2014 / 12:46
2

NTP offset pode ser obtido com o seguinte pipeline do UNIX:

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

A contagem de pares de NTP pode ser obtida com o seguinte pipeline do UNIX:

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

Para NTP offet usamos:

  • aviso > 250 ms
  • crítico > 500 ms

Para contagem de pares de NTP , usamos:

  • sem limite de aviso
  • crítica < 1

Configuração de monitoramento NTP preparada para o Zabbix (fonte: 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 '^\*|^\+'

Plug-ins de monitoramento NTP prontos para 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

Eu realmente devo deixar que os limites críticos e de aviso nos scripts do Nagios sejam configuráveis com -w e -c. Eles não são totalmente prontos para o plugin sem isso. Mais orientações sobre isso em um tutorial aqui: link

    
por 18.11.2016 / 14:32
1

O Chrony é responsável por lidar melhor com o seu caso de uso do que com o NTPd (rede e máquina ligadas / desligadas, suspensas, etc.). Veja

link

Por que eu acho que Chronny é bom: Ele veio pré-instalado na minha máquina fedora e eu nunca tive nenhum problema com ele (usei isso por anos). Eu nunca tive problemas com o ntpd no passado, mas se você ler no link que eu forneci, há algumas informações sobre o porquê chrony é melhor para nem sempre em máquinas. É por isso que eu sugeri ao op para experimentá-lo, pode ou não funcionar melhor para ele. Então, é apenas mais uma boa opção para experimentar antes de entrar em muito ajuste, otimizando e hackeando o ntpd.

    
por 25.01.2013 / 22:04
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
    
por 24.09.2014 / 20:22
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

O mesmo que a resposta anterior acima, mas com uma ligeira modificação, pois o comando anterior executará a instrução if para tantos deslocamentos, isto é, se o deslocamento for 3, ele imprimirá NTP dentro de 0,1 ... 3 vezes antes de fechar . Pode ser irritante se você tiver um servidor que está muito longe de ser sincronizado. Provavelmente existe uma maneira de remover o loop for também ...

    
por 20.01.2014 / 05:44

Tags