NTPDを使用してLinuxマシンの時間を指定したNTPサーバーに更新します。
シナリオは次のとおりです:
Linuxマシンが起動するたびに、NTP server and それが成功しなかった場合、成功するまで5分ごとに再試行したい(最大は2時間です)。
私は周りを検索しましたが、NTPDを使用する必要があり(?)、次のようなコマンドを使用します。
#ntpdate ntp.server.com
(NTPDを開始する前)#ntpd some_options_to_start
質問は次のとおりです。
sleep
のようなものを使用し、do
..while
/for
でループする必要がありますか?)上記のコマンドをシェルスクリプトで実行し、シェルをWebサーバーに配置することに注意してください。次に、クライアント(Webブラウザーブラウザーを使用)がWebサイトでスクリプトを実行します。したがって、更新が成功したかどうかを確認して、結果をクライアントに(Web経由で)送信する必要があります。
スクリプトを使用してntpd
を監視することは一般的に行われていません。通常、nagios
やmunin
などの監視ツールを使用してデーモンを監視します。ツールは、問題が発生したときにアラートを送信できます。オフセットが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
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
最初の質問に答えるために、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サーバーにはntpdc
とntpq
の両方があるので、注意する必要があります。
ntp-wait
はこの問題のために作成されました。
man ntp-wait
を5分間使用すると、稼働状態になります...
@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`
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の場合、次を使用します:
NTPピアカウントの場合、次を使用します:
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
#!/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
Chronyは、NTPd(ネットワークとマシンのオン/オフ、サスペンドなど)よりもユースケースをうまく処理すると主張しています。見る
http://fedoraproject.org/wiki/Features/ChronyDefaultNTP
REなぜ私はchronnyが良いと思うのですか?Fedoraマシンにプリインストールされていたので、何も問題がありませんでした(これを何年も使用しています)。私も過去にntpdに問題があったことはありませんが、私が提供したリンクを読んだ場合、マシン上で常にnonyがchronyのほうが適している理由に関する情報があります。それが私がそれを試してみるようにオペレーションに提案した理由です、それは彼にとってより良いかそうでないかもしれません。したがって、過度の調整、最適化、およびntpdのハッキングに入る前に試すのは、もう1つの良いオプションです。
#!/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ループを削除する方法もあるでしょう...