web-dev-qa-db-ja.com

シェルを使用してNTPDがマシンの時刻を正常に更新しているかどうかを確認する方法

NTPDを使用してLinuxマシンの時間を指定したNTPサーバーに更新します。
シナリオは次のとおりです:

Linuxマシンが起動するたびに、NTP server and それが成功しなかった場合、成功するまで5分ごとに再試行したい(最大は2時間です)。

私は周りを検索しましたが、NTPDを使用する必要があり(?)、次のようなコマンドを使用します。

#ntpdate ntp.server.com(NTPDを開始する前)
#ntpd some_options_to_start

質問は次のとおりです。

  1. これらのコマンドによって時刻が正常に更新されたかどうかを確認するにはどうすればよいですか?
  2. Ntpdから時間を更新する間隔を設定できますか? (またはsleepのようなものを使用し、do..while/forでループする必要がありますか?)

上記のコマンドをシェルスクリプトで実行し、シェルをWebサーバーに配置することに注意してください。次に、クライアント(Webブラウザーブラウザーを使用)がWebサイトでスクリプトを実行します。したがって、更新が成功したかどうかを確認して、結果をクライアントに(Web経由で)送信する必要があります。

22
sees

スクリプトを使用してntpdを監視することは一般的に行われていません。通常、nagiosmuninなどの監視ツールを使用してデーモンを監視します。ツールは、問題が発生したときにアラートを送信できます。オフセットが15ミリ秒を超える場合は、muninにメールを送信します。

通常、奇数のサーバーを使用して、サーバーが停止した場合にデーモンがサーバー間で選択できるようにする必要があります。通常は3つで十分ですが、5つ以上で十分です。内部ネットワーク上のクライアントは、監視していれば1つの内部サーバーで問題なく処理できるはずです。正規のサーバーまたはISPを使用する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
23
BillThor

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
8
Paul T

最初の質問に答えるために、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ページとして:

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

したがって、明らかに、「オフセット」は秒単位です。

ntpdcは廃止され、ntpqに置き換えられたようです。 ntpqには「ピア」インタラクティブコマンドがあり、ミリ秒単位の「オフセット」を提供します。私のRedhatサーバーにはntpdcntpqの両方があるので、注意する必要があります。

8
Bruce Ediger

ntp-waitはこの問題のために作成されました。

man ntp-waitを5分間使用すると、稼働状態になります...

7
dfc

@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
DFE

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の場合、次を使用します:

  • 警告> 250ms
  • クリティカル> 500ms

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 '^\*|^\+'

Nagios対応NTP監視プラグイン:

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

2
Alain O'Dea
#!/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
1
Lijundas KL

Chronyは、NTPd(ネットワークとマシンのオン/オフ、サスペンドなど)よりもユースケースをうまく処理すると主張しています。見る

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

REなぜ私はchronnyが良いと思うのですか?Fedoraマシンにプリインストールされていたので、何も問題がありませんでした(これを何年も使用しています)。私も過去にntpdに問題があったことはありませんが、私が提供したリンクを読んだ場合、マシン上で常にnonyがchronyのほうが適している理由に関する情報があります。それが私がそれを試してみるようにオペレーションに提案した理由です、それは彼にとってより良いかそうでないかもしれません。したがって、過度の調整、最適化、およびntpdのハッキングに入る前に試すのは、もう1つの良いオプションです。

1
akostadinov
#!/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 is 0.1 .. ..終了する前に3回。長い同期がとれていないサーバーがある場合、煩わしいかもしれません。おそらくforループを削除する方法もあるでしょう...

0
user3213415