Comment vérifier si NTPD met à jour l'heure de la machine avec succès en utilisant le shell?

21

J'essaie d'utiliser NTPD pour mettre à jour l'heure de ma machine Linux vers un serveur NTP spécifié.
Voici le scénario:

Chaque fois que la machine Linux démarre, je veux mettre à jour l'heure à partir du serveur NTP et si elle ne réussit pas, je veux réessayer toutes les 5 minutes jusqu'à ce que cela réussisse (max est de 2 heures).

J'ai cherché autour et j'ai trouvé que je devais (?) Utiliser NTPD et utiliser une commande comme:

#ntpdate ntp.server.com (avant de démarrer NTPD)
#ntpd some_options_to_start

Les questions sont:

  1. Comment savoir si l'heure a bien été mise à jour par ces commandes?
  2. Puis-je définir l'intervalle de mise à jour de l'heure à partir de ntpd? (ou je dois utiliser quelque chose comme sleepet boucler avec do.. while/ fordans le shell?)

Notez que je veux exécuter les commandes ci-dessus dans un script shell et mettre le shell dans un serveur web. Ensuite, les clients (avec un navigateur Web) exécuteront le script sur le site Web. J'ai donc besoin de vérifier si la mise à jour est réussie ou de ne pas envoyer de résultat au client (sur le Web).

voit
la source

Réponses:

22

L'utilisation d'un script pour surveiller ntpdn'est pas courante. Habituellement, un outil de surveillance comme nagiosou muninest utilisé pour surveiller le démon. L'outil peut vous envoyer une alerte en cas de problème. Je muninm'envoie un e-mail si le décalage dépasse 15 millisecondes.

Normalement, vous devez utiliser un nombre impair de serveurs afin que le démon puisse effectuer une élection parmi les serveurs en cas de panne. Trois est généralement suffisant et plus de cinq est excessif. Les clients de votre réseau interne devraient pouvoir se débrouiller avec un seul serveur interne si vous le surveillez. Utilisez des serveurs légitimes ou vos serveurs NTP ou DNS FAI comme sources d'horloge. Il existe des pools publics ainsi que des serveurs publics.

ntpdest à réglage automatique et vous ne devriez pas avoir besoin de le régler une fois qu'il est configuré et démarré. Avec les ntpdimplémentations récentes, vous pouvez abandonner ntpdatecomplètement l' utilisation car elles peuvent faire le réglage initial de la date.

Le script suivant analysera les décalages dans la sortie de ntpd et signalera un décalage excessif. Vous pouvez l'exécuter depuis cron pour vous envoyer un e-mail en cas de problème. Par défaut, le script alerte sur un décalage de 0,1 seconde.

#!/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
la source
C'est la première fois que j'entends parler de quelqu'un qui surveille l'heure du système. Excellente réponse.
Bruce Ediger
@BillTHor: Excellente réponse. Merci beaucoup. J'essaierai de l'appliquer à mon travail actuel
voit
@BruceEdiger Je suppose que vous n'avez jamais entendu parler des gens sur la liste de diffusion Time-Nut.
dfc
En ce qui concerne "L'utilisation d'un script pour surveiller ntpd n'est pas couramment effectuée" va; le répertoire des scripts à l'intérieur de l'archive tar ntp pointe vers la conclusion opposée.
dfc
@dvc Les scripts ne semblent pas inclure la fonctionnalité demandée. Il semble y avoir du code pour générer des interruptions SNMP, mais je n'ai pas rencontré SNMP pour surveiller NTP. J'ai dû faire mon propre suivi dans plusieurs grandes organisations.
BillThor
8

Utilisez 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
la source
1
Sur Ubuntu 16.04, j'ai trouvé un buggy ntpstat. Après avoir débranché mon câble réseau, il était toujours affiché comme synchronisé avec l'état de retour 0, bien qu'il n'ait ntpq -pmontré aucun homologue. Je ne fais donc pas confiance à cet utilitaire.
Huygens
8

Pour répondre à la première question, il ntpdatevous indique généralement ce qu'il a fait ou n'a peut-être pas fait.

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

Le démon NTP ntpd, s'exécute en permanence et demande de temps en temps aux serveurs NTP (généralement configurés dans /etc/ntp.conf). Vous ne devriez pas avoir à exécuter votre script toutes les 5 minutes. ntpdatedevrait mettre la machine en synchronisation avec le serveur, et ntpdfonctionnera en arrière-plan et la gardera synchronisée. Vous ne définissez pas l'intervalle que ntpd essaie, il ajuste l'intervalle en fonction de la façon dont il perçoit les dérives de l'horloge locale à partir des serveurs et de la qualité des connexions aux serveurs.

Vous pouvez utiliser un programme nommé ntpdcpour voir ce qui ntpdreste comme information:

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>

Je pense que le nombre qui vous intéresse généralement est "offset", c'est le nombre de secondes pendant lesquelles votre horloge locale est éloignée de celle du serveur.

Comme la manpage des ntpdcétats pour la commande "pairs":

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

Donc, clairement, le "décalage" est en secondes.

Il semble que ntpdcsoit obsolète, remplacé par ntpq. ntpqa une commande interactive "pairs", qui donne "décalage" en millisecondes. Mon serveur Redhat possède les deux ntpdcet ntpq, vous devrez donc faire attention.

Bruce Ediger
la source
Génial! Mais il y a une partie peu claire dans ma question. Je vais exécuter un script shell dans un programme C. Et je voulais vérifier la valeur de retour (peut-être que j'utiliserai la fonction système ("shellscript")). Votre réponse me donne une idée que nous ne devons pas définir d'intervalle pour NTPD et juste au cas où, je voudrais changer de serveur NTP, je dois éditer le fichier ntp.conf. Pourriez-vous me dire comment ntpd fonctionne avec le serveur ntp. Dois-je redémarrer le démon ntpd après avoir édité le fichier ntp.conf (à nouveau en utilisant le script shell )
voit
ntpd est un processus démon - il s'exécute en continu. Il décide de la fréquence à laquelle demander à un serveur l'heure actuelle, ainsi que de la fréquence et de la fréquence de changement de l'horloge locale, en fonction de la dérive de l'horloge locale: vous ne pouvez vraiment contrôler aucun des intervalles. ntpd s'exécute en arrière-plan. Pour changer un serveur NTP, vous modifiez /etc/ntp.conf et arrêtez puis démarrez ntpd.
Bruce Ediger
Je dois également mentionner que le fragment de code que vous avez publié doit être exécuté au niveau d'exécution 3 ou au-dessus pendant le démarrage. ntpdate définit l'horloge système, puis ntpd devient un processus démon et maintient l'horloge synchronisée avec les serveurs. Normalement, vous n'exécutez pas ces 2 lignes de code pour simplement "régler l'horloge".
Bruce Ediger
J? ai compris. Que diriez-vous de ntpdate quand il obtient le mauvais ntpserver (par exemple) et ne fonctionne pas correctement. Comment puis-je le savoir à partir de scripts shell?
voit
7

ntp-wait a été fait pour ce problème.

Cinq minutes avec man ntp-waitet vous devriez être opérationnel ...

dfc
la source
J'ai trouvé ntp-wait dans debian, mais pas dans centos. s'il vous plaît aidez!
Massimo
2

J'ai également ajouté au script bash @BillTHor une vérification du code de sortie 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

[MISE À JOUR] puisque le script utilisant la sortie ntpq était inutile pour le décalage larget (plus de 4 chiffres de décalage), j'ai essayé une nouvelle version utilisant uniquement 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
la source
2

Le décalage NTP peut être obtenu avec le pipeline UNIX suivant:

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

Le nombre de pairs NTP peut être obtenu avec le pipeline UNIX suivant:

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

Pour la compensation NTP, nous utilisons:

  • avertissement> 250 ms
  • critique> 500 ms

Pour le nombre de pairs NTP, nous utilisons:

  • pas de seuil d'avertissement
  • critique <1

Configuration de surveillance NTP compatible Zabbix (source: 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 '^\*|^\+'

Plugins de surveillance NTP prêts pour 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

Je devrais vraiment laisser l'avertissement et les seuils critiques dans les scripts Nagios être configurables avec -w et -c. Sans cela, ils ne sont pas vraiment entièrement prêts pour les plugins. Plus d'informations à ce sujet dans un didacticiel ici: http://www.kernel-panic.it/openbsd/nagios/nagios6.html

Alain O'Dea
la source
1

Chrony est censé gérer votre cas d'utilisation mieux que NTPd (marche / arrêt du réseau et de la machine, suspension, etc.). Voir

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

RE pourquoi je pense que chronny est bon: il est venu pré-installé sur ma machine fedora et je n'ai jamais eu de problème avec (utilisé depuis des années maintenant). Je n'ai jamais eu de problème avec ntpd dans le passé aussi, mais si vous lisez le lien que j'ai fourni, il y a quelques informations sur pourquoi chrony est meilleur pour les non-toujours sur les machines. C'est pourquoi j'ai suggéré à l'op de l'essayer, cela peut ou peut ne pas fonctionner mieux pour lui. C'est donc juste une autre bonne option à essayer avant d'entrer dans trop de réglages, d'optimisation et de piratage de ntpd.

akostadinov
la source
1
s'il vous plaît commenter si vous downvote avec votre rationnel
akostadinov
Pourquoi pensez-vous que Chrony est mieux?
dfc
@dfc, il est venu pré-installé sur ma machine fedora et je n'ai jamais eu de problème avec (utilisé depuis des années maintenant). Je n'ai jamais eu de problème avec ntpd dans le passé également, mais si vous lisez le lien que j'ai fourni, il y a des informations sur pourquoi chrony est meilleur pour les non-toujours sur les machines. C'est pourquoi j'ai suggéré à l'op de l'essayer, cela peut ou peut ne pas fonctionner mieux pour lui. C'est donc juste une autre bonne option à essayer avant d'entrer dans trop de réglages, d'optimisation et de piratage de ntpd.
akostadinov
Ajoutez plutôt ces informations sur la réponse elle-même. Il est suffisamment précieux et vous pourriez peut-être faire inverser le vote.
tshepang
Étant donné que votre réponse ne correspond pas à la question réelle, à mon avis, est-elle mieux adaptée pour être un commentaire sur la question.
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
la source
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

Identique à la réponse précédente ci-dessus, mais avec une légère modification car la commande précédente exécutera l'instruction if pour autant de décalages, c.-à-d. Si le décalage est de 3, elle imprimera NTP à 0,1 ... 3 fois avant la fermeture. Cela peut être gênant si vous avez un serveur qui est loin d'être synchronisé. Il existe probablement un moyen de supprimer la boucle for également ...

user3213415
la source