NTPD가 셸을 사용하여 시스템 시간을 성공적으로 업데이트하는지 확인하는 방법은 무엇입니까?


21

NTPD를 사용하여 Linux 시스템 시간을 지정된 NTP 서버로 업데이트하려고합니다.
시나리오는 다음과 같습니다.

Linux 컴퓨터가 시작될 때마다 NTP 서버에서 시간을 업데이트하고 싶습니다. 성공하지 못하면 5 분마다 다시 시도하고 싶습니다 (최대 2 시간).

나는 주변을 검색하고 NTPD를 사용해야하고 다음과 같은 명령을 사용해야한다는 것을 알았습니다.

#ntpdate ntp.server.com (NTPD를 시작하기 전에)
#ntpd some_options_to_start

질문은 :

  1. 이 명령으로 시간이 성공적으로 업데이트되었는지 어떻게 알 수 있습니까?
  2. ntpd에서 시간을 업데이트하도록 간격을 설정할 수 있습니까? (또는 쉘에서 .. / sleep와 비슷한 것을 사용해야 합니까?)dowhilefor

위의 명령을 쉘 스크립트에서 실행하고 쉘을 웹 서버에 넣을 것입니다. 그런 다음 클라이언트 (웹 브라우저 브라우저 사용)는 웹 사이트에서 스크립트를 실행합니다. 따라서 업데이트가 성공했는지 또는 웹을 통해 클라이언트에 결과를 보내지 않아야하는지 확인해야합니다.

답변:


22

스크립트를 사용하여 모니터링 ntpd하는 것은 일반적으로 수행되지 않습니다. 일반적으로 nagios또는 munin데몬을 모니터링하는 데 또는 같은 모니터링 도구 가 사용됩니다. 문제가 발생하면이 도구를 사용하여 경고를 보낼 수 있습니다. 나는 한 munin오프셋 (offset)이 15 밀리 초를 초과하는 경우에 저를 이메일을 보내.

일반적으로 서버가 중단 될 때 데몬이 서버간에 선택을 수행 할 수 있도록 홀수의 서버를 사용해야합니다. 보통 3 개가 적당하고 5 개 이상이 과도합니다. 내부 네트워크의 클라이언트는 모니터링 할 경우 하나의 내부 서버를 사용할 수 있어야합니다. 합법적 인 서버 나 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

시스템 시간을 모니터링하는 사람에 대해 들어 본 첫 번째 사례입니다. 훌륭한 답변입니다.
Bruce Ediger

@BillTHor : 훌륭한 답변입니다. 고마워 내 현재 작업에 적용하려고합니다은
보고

@BruceEdiger 나는 당신이 타임 너트 메일 링리스트에있는 사람들에 대해 들어 본 적이 없다고 생각합니다.
dfc

"ntpd를 모니터하기 위해 스크립트를 사용하는 것은 일반적으로 수행되지 않습니다"까지; ntp tarball 내부의 scripts 디렉토리는 반대 결론을 가리 킵니다.
dfc

@dvc 스크립트에 요청 된 기능이 포함되어 있지 않습니다. SNMP 트랩을 생성하는 코드가 있지만 NTP를 모니터링하기 위해 SNMP를 발견하지 못했습니다. 여러 대기업에서 자체 모니터링을 수행해야했습니다.
BillThor

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
우분투 16.04에서 ntpstat buggy를 찾았습니다. 네트워크 케이블을 분리 한 후에도 ntpq -p피어가 표시되지 않았 음에도 여전히 리턴 상태 0과 동기화 된 것으로 표시되었습니다 . 그래서 나는이 유틸리티를 신뢰하지 않습니다.
Huygens

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더 이상 사용되지 않으며로 대체 된 것으로 보입니다 ntpq. ntpq"피어"대화식 명령이 있으며,이 명령은 밀리 초 단위로 "오프셋"을 제공합니다. 내 레드햇 서버는 모두가 ntpdc하고 ntpq당신이 조심해야합니다, 그래서.


큰! 그러나 내 질문에는 분명하지 않은 부분이 있습니다. C 프로그램에서 쉘 스크립트를 실행하겠습니다. 그리고 반환 값을 확인하고 싶었습니다 (아마도 system ( "shellscript") 함수를 사용하겠습니다). 귀하의 답변에 따라 NTPD 간격을 설정해서는 안되며 NTP 서버를 변경하려는 경우 ntp.conf 파일을 편집해야합니다. ntpd가 ntp 서버와 작동하는 방식을 알려주십시오. 내가 (다시 사용하여 NTP를 파일을 편집 한 후 ntpd가 데몬을 다시 시작해야합니까 쉘 스크립트 )
보고

ntpd는 데몬 프로세스이며 지속적으로 실행됩니다. 로컬 시계가 표류하는 방식에 따라 서버에 현재 시간을 묻는 빈도와 로컬 시계 변경 빈도 및 빈도를 결정합니다. 간격을 실제로 제어 할 수는 없습니다. ntpd는 백그라운드에서 실행됩니다. NTP 서버를 변경하려면 /etc/ntp.conf를 편집하고 ntpd를 중지 한 다음 시작하십시오.
브루스 Ediger

또한 게시 한 코드 조각이 부팅하는 동안 런레벨 3 이상에서 실행되어야한다고 언급해야합니다. ntpdate는 시스템 시계를 설정 한 다음 ntpd는 데몬 프로세스가되고 시계를 서버와 동기화 된 상태로 유지합니다. 일반적으로, "시계를 설정"하기 위해이 두 줄의 코드를 실행하지 않습니다.
Bruce Ediger

알았어 예를 들어 잘못된 ntpserver를 가져 와서 제대로 작동하지 않는 ntpdate는 어떻습니까? 쉘 스크립트에서 어떻게 알 수 있습니까?
보고

7

ntp-wait 이 문제를 위해 만들어졌습니다.

5 분 남았을 때 man ntp-wait당신은 ...


데비안에서는 ntp-wait를 찾았지만 centos에서는 찾지 못했습니다. 도와주세요 !
Massimo

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
당신이 당신의 합리적인으로
하향 투표하는

왜 크로 니가 더 낫다고 생각합니까?
dfc

@dfc, 그것은 내 페도라 시스템에 사전 설치되어 왔으며 아무런 문제가 없었습니다 (현재 몇 년 동안 사용되었습니다). 과거에도 ntpd에 문제가 없었지만 제공 한 링크를 읽으면 왜 컴퓨터에서 비 연속성이 더 나은지에 대한 정보가 있습니다. 그렇기 때문에 나는 op에게 시도해 보라고 제안했다. 너무 많은 튜닝, 최적화 및 해킹 ntpd에 들어가기 전에 시도해 볼 수있는 또 다른 좋은 옵션입니다.
akostadinov

오히려이 정보를 답변 자체에 추가하십시오. 그것은 충분히 가치가 있으며 투표권을 뒤집을 수도 있습니다.
tshepang

귀하의 답변이 실제 질문과 일치하지 않는다고 생각하면, 질문에 대한 의견을 제시하는 것이 더 좋습니다.
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

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 문을 실행합니다. 동기화되지 않은 서버가 있다면 성 가실 수 있습니다. 아마도 for 루프를 제거하는 방법이있을 것입니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.