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


21

NTPDを使用して、Linuxマシンの時刻を指定されたNTPサーバーに更新しようとしています。
シナリオは次のとおりです。

Linuxマシンが起動するたびに、NTPサーバーから時刻を更新し、成功しない場合は、成功するまで5分ごとに再試行します(最大2時間)。

私は周りを検索し、NTPDを使用し、次のようなコマンドを使用する必要があることを見つけました:

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

質問は次のとおりです。

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

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

回答:


22

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

通常、1つのサーバーが停止した場合にデーモンがサーバー間で選択を実行できるように、奇数のサーバーを使用する必要があります。通常は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

これは、システム時間を監視している人の最初のインスタンスです。素晴らしい答え。
ブルースエディガー

@BillTHor:すばらしい答えです。どうもありがとう。私の現在の仕事にそれを適用しようとします
見て

@BruceEdigerタイムナッツのメーリングリストで聞いたことのない人がいると思います。
dfc 14年

「スクリプトを使用してntpdを監視することは一般的に行われていない」限り、ntp tarball内のscriptsディレクトリは、反対の結論を示しています。
dfc 14年

@dvcそこにあるスクリプトには、要求された機能が含まれていないようです。SNMPトラップを生成するためのコードがいくつかあるようですが、NTPを監視するためのSNMPには遭遇していません。いくつかの大規模な組織で独自の監視を行う必要がありました。
BillThor 14年

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のバグが見つかりました。ネットワークケーブルを抜いた後ntpq -p、ピアは表示されませんでしたが、リターンステータス0と同期された状態で表示されたままです。だから私はこのユーティリティを信用していません。
ホイヘンス

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

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

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

その現れntpdcで置き換えられ、廃止されましたntpqntpqミリ秒単位で「オフセット」を与える「ピア」インタラクティブコマンドがあります。私のRedHatのサーバーは両方持っているntpdcntpq、あなたは注意する必要があります。


すばらしいです!しかし、私の質問には不明確な部分があります。Cプログラムでシェルスクリプトを実行します。そして、戻り値をチェックしたかったです(おそらくsystem( "shellscript")関数を使用します)。あなたの答えは、NTPDの間隔を設定するべきではないという考えを与えてくれます。念のため、NTPサーバーを変更したい場合は、ntp.confファイルを編集する必要があります。ntpdがntpサーバーで動作する方法を教えてください。私は(使用して再度のntp.confファイルを編集した後、再起動のntpdデーモンを持っていますかシェルスクリプトを
見て

ntpdはデーモンプロセスです-継続的に実行されます。現在の時刻をサーバーに要求する頻度と、ローカルクロックがどのように変動するかに基づいて、ローカルクロックを変更する頻度と量を決定します。実際に間隔を制御することはできません。ntpdはバックグラウンドで実行されます。NTPサーバーを変更するには、/ etc / ntp.confを編集し、ntpdを停止してから起動します。
ブルースエディガー

また、投稿したコードフラグメントは、ブート中にランレベル3以上で実行されることに注意してください。ntpdateはシステムクロックを設定し、ntpdはデーモンプロセスになり、サーバーとクロックを同期させます。通常、「クロックを設定する」ためにこれらの2行のコードを実行することはありません。
ブルースエディガー

わかった。(たとえば)間違ったntpserverを取得して正しく動作しない場合のntpdateはどうでしょうか。シェルスクリプトからどのように知ることができますか?
見て

7

ntp-wait この問題のために作られました。

5分でman ntp-wait、あなたは稼働しているはずです...


debianでntp-waitを見つけましたが、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 }'

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


1

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

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

REなぜchronnyは良いと思いますか?フェノラマシンにプリインストールされており、問題が発生したことはありません(これは何年も使用されています)。過去にもntpdで問題が発生したことはありませんが、私が提供したリンクを読んでいると、常にマシン上にないのにchronyが優れている理由に関する情報があります。だからこそ、私はそれを試してみるようにopに提案しました。したがって、ntpdのチューニング、最適化、およびハッキングを行う前に試すのは、もう1つの良い選択肢です。


1
合理的でダウン投票した場合コメントしてください
akostadinov 14年

なぜあなたは慢性が優れていると思いますか?
dfc 14年

@dfc、それは私のfedoraマシンにプリインストールされていて、私はそれで何の問題も経験したことはありませんでした(何年も前から使用していました)。過去にもntpdで問題が発生したことはありませんが、私が提供したリンクを読んでいると、常にマシン上にないのにchronyが優れている理由に関する情報があります。だからこそ、私はそれを試してみるようにopに提案しました。したがって、ntpdのチューニング、最適化、およびハッキングを行う前に試すのは、もう1つの良い選択肢です。
アコスタディノフ14年

むしろ、回答自体にこの情報を追加してください。それは十分に価値があり、あなたはちょうど反対票を得るかもしれません。
tshepang

あなたの答えが実際の質問と一致しないことを考えると、私の意見では、質問へのコメントに適していると思います。
ハイメ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

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ステートメントを実行するため、わずかな変更を加えます。つまり、offsetが3の場合、NTPは0.1 ....以内に3回出力されます。同期がとれていないサーバーがある場合、迷惑になる可能性があります。おそらくforループを削除する方法もあるでしょう...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.