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

21

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

Cada vez que a máquina Linux é inicializada, quero atualizar o horário do servidor NTP e, se não for bem-sucedido, quero tentar novamente a cada 5 minutos até obter êxito (o máximo é de 2 horas).

Eu procurei e achei 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 a hora foi atualizada com sucesso por esses comandos?
  2. Posso definir o intervalo para atualizar o tempo do ntpd? (ou eu tenho que usar algo como sleepe fazer loop com do.. while/ forcom shell?)

Observe que eu quero executar os comandos acima em um script de shell e colocá-lo 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 ao cliente (pela Web).


fonte

Respostas:

22

O uso de um script para monitorar ntpdgeralmente não é feito. Geralmente, uma ferramenta de monitoramento como nagiosou muniné usada para monitorar o daemon. A ferramenta pode enviar um alerta quando algo der errado. Tenho muninme e-mail se o deslocamento for superior a 15 milissegundos.

Normalmente, você deve usar um número ímpar de servidores para que o daemon possa executar uma eleição entre os servidores, se um deles sair. Três são geralmente adequados e mais de cinco são excessivos. Os clientes em sua rede interna devem poder conviver com um servidor interno, se você o monitorar. Use servidores legítimos ou seus servidores ISP NTP ou DNS como fontes de relógio. Existem piscinas públicas e servidores públicos.

ntpdé auto-ajustável e você não precisa ajustá-lo depois de configurado e iniciado. Com ntpdimplementações recentes, você pode abandonar o uso ntpdateinteiramente, pois elas podem fazer a configuração inicial da data.

O script a seguir analisará as compensações na saída do ntpd e relatará um deslocamento excessivo. Você pode executá-lo do cron para enviar um e-mail se houver problemas. O script padrão é alertar em um deslocamento de 0,1 segundos.

#!/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
fonte
Esta é a primeira instância que ouvi de alguém monitorando a hora do sistema. Excelente resposta.
precisa saber é o seguinte
@ BillTHor: Ótima resposta. Muito obrigado. Vou tentar aplicá-lo ao meu trabalho atual
@BruceEdiger Suponho que você nunca tenha ouvido falar do pessoal da lista de discussão de malucos.
dfc
Na medida em que "Usar um script para monitorar o ntpd geralmente não é feito" vai; o diretório scripts dentro do tarball ntp aponta para a conclusão oposta.
dfc
@dvc Os scripts não parecem incluir a funcionalidade solicitada. Parece haver algum código para gerar traps SNMP, mas não encontrei o SNMP para monitorar o NTP. Eu tive que fazer meu próprio monitoramento em várias grandes organizações.
BillThor
8

Use 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
Paul T
fonte
1
No Ubuntu 16.04, encontrei o ntpstat buggy. Depois de desconectar meu cabo de rede, ele ainda era mostrado como sincronizado com o status de retorno 0, embora ntpq -pnão apresentasse pares. Portanto, não estou confiando neste utilitário.
Huygens
8

Para responder à primeira pergunta, ntpdategeralmente diz o que fez ou talvez não fez.

[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 aos servidores NTP (geralmente configurados /etc/ntp.conf) o tempo de tempos em tempos. Você não precisa executar seu script a cada 5 minutos. ntpdatedeve colocar a máquina quase em sincronia com o servidor e ntpdserá executada em segundo plano e a manterá sincronizada. Você não define o intervalo que o ntpd tenta, ele ajusta o intervalo com base em como ele percebe o relógio local se desviar dos servidores e na qualidade das conexões com os servidores.

Você pode usar um programa chamado ntpdcpara ver o que ntpdmantém como informação:

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>

Eu acho que o número em que você normalmente tem interesse é "deslocamento", esse é o número de segundos em que o relógio local está fora do relógio do servidor.

Como a manpágina para ntpdcestados do comando "peers":

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

Então, claramente, o "deslocamento" é em segundos.

Parece que ntpdcfoi descontinuado, substituído por ntpq. ntpqpossui um comando interativo "pares", que fornece "deslocamento" em milissegundos. Meu servidor Redhat possui ambos ntpdce ntpq, portanto, você precisará ter cuidado.

Bruce Ediger
fonte
Ótimo! Mas há uma parte incerta na minha pergunta. Vou executar um script de shell em um programa C. E queria verificar o valor de retorno (talvez eu use a função system ("shellscript")). Sua resposta me dá uma idéia de que não devemos definir intervalo para NTPD e, no caso de eu querer mudar o servidor NTP, tenho que editar o arquivo ntp.conf. Você poderia me dizer como o ntpd funciona com o servidor ntp. Preciso reiniciar o daemon ntpd depois de editar o arquivo ntp.conf (novamente usando o shell script )
veja
O ntpd é um processo daemon - ele roda continuamente. Ele decide com que freqüência solicitar a um servidor a hora atual e com que freqüência e quanto alterar o relógio local, com base em como o relógio local varia: você não pode realmente controlar nenhum dos intervalos. O ntpd é executado em segundo plano. Para alterar um servidor NTP, edite o /etc/ntp.conf e pare e inicie o ntpd.
Bruce Ediger 12/08
Também devo mencionar que o fragmento de código que você postou deve ser executado no nível de execução 3 ou acima dele durante a inicialização. O ntpdate define o relógio do sistema, e o ntpd se torna um processo daemon e mantém o relógio sincronizado com os servidores. Normalmente, você não executa essas duas linhas de código apenas para "acertar o relógio".
precisa
Deixa comigo. Que tal o ntpdate quando obtém o ntpserver errado (por exemplo) e não funciona corretamente. Como posso saber isso a partir de shell scripts?
7

ntp-wait foi feito para esse problema.

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

dfc
fonte
Encontrei ntp-wait no debian, mas não no centos. por favor ajude !
Massimo
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] Como o script que usa a saída ntpq foi inútil para o deslocamento grande (mais de 4 dígitos do deslocamento), tentei uma nova versão usando apenas o 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`
DFE
fonte
2

O deslocamento NTP pode ser obtido com o seguinte pipeline UNIX:

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

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

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

Para compensação NTP , usamos:

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

Para a contagem de pares NTP , usamos:

  • sem limite de aviso
  • crítico <1

Configuração de monitoramento NTP pronto para 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 deveria permitir que os limites crítico e de aviso nos scripts do Nagios fossem configuráveis ​​com -w e -c. Eles não estão totalmente prontos para plugins sem isso. Mais orientações sobre isso em um tutorial aqui: http://www.kernel-panic.it/openbsd/nagios/nagios6.html

Alain O'Dea
fonte
1

Alega-se que o Chrony lida com o seu caso de uso melhor do que o NTPd (ligar / desligar a rede e a máquina, suspender etc.). Vejo

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

RE, por que eu acho que o chronny é bom: veio pré-instalado na minha máquina fedora e nunca tive nenhum problema com ela (usei-a há anos). Eu nunca tive problemas com o ntpd no passado também, mas se você ler o link que forneci, há algumas informações sobre por que o chrony é melhor para nem sempre nas máquinas. Foi por isso que sugeri à operação para experimentar, pode ou não funcionar melhor para ele. Portanto, é apenas mais uma boa opção para tentar antes de entrar em muitos ajustes, otimização e pirataria do ntpd.

akostadinov
fonte
1
por favor, comente se você votou com o seu racional
akostadinov
Por que você acha que chrony é melhor?
dfc
@dfc, ele veio pré-instalado na minha máquina fedora e nunca tive nenhum problema com ela (usei-a há anos). Eu nunca tive problemas com o ntpd no passado também, mas se você ler o link que forneci, há algumas informações sobre por que o chrony é melhor para nem sempre nas máquinas. Foi por isso que sugeri à operação para experimentar, pode ou não funcionar melhor para ele. Portanto, é apenas mais uma boa opção para tentar antes de entrar em muitos ajustes, otimização e pirataria do ntpd.
akostadinov 23/01
Em vez disso, adicione essas informações na própria resposta. É valioso o suficiente e você pode reverter a votação.
tshepang
Dado que sua resposta não corresponde à pergunta real, na minha opinião, é mais adequado fazer um comentário sobre a questão.
Jaime Hablutzel
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
Lijundas KL
fonte
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

Igual à resposta anterior acima, mas com uma ligeira modificação, o comando anterior executará a instrução if para o mesmo número de deslocamentos, ou seja, se o deslocamento for 3, o NTP imprimirá dentro de 0,1 .... 3 vezes antes de fechar. Pode ser irritante se você tiver um servidor muito longe de sincronia. Provavelmente existe uma maneira de remover o loop for também ...

user3213415
fonte