NTPD를 사용하여 Linux 컴퓨터의 시간을 지정된 NTP 서버로 업데이트하려고 합니다.
시나리오는 다음과 같습니다.
Linux 시스템이 부팅될 때마다 NTP 서버의 시간을 업데이트하고 싶습니다.성공하지 못하면 성공할 때까지 5분마다 다시 시도하고 싶습니다.(최대 2시간)
검색해본 결과 NTPD를 사용해야 하고 다음과 같은 명령을 사용해야 한다는 것을 알았습니다.
#ntpdate ntp.server.com
(NTPD를 시작하기 전)
#ntpd some_options_to_start
문제는 다음과 같습니다
- 이 명령이 시간을 성공적으로 업데이트했는지 어떻게 알 수 있나요?
- ntpd에서 시간 업데이트 간격을 설정할 수 있나요? (아니면 쉘에서
sleep
and loopdo
../ 같은while
것을 사용해야 합니까for
?)
위의 명령을 쉘 스크립트에서 실행하고 쉘을 웹 서버에 넣고 싶습니다. 그러면 클라이언트(웹 브라우저 사용)가 웹 사이트에서 스크립트를 실행합니다. 따라서 (네트워크를 통해) 클라이언트에 결과를 전송하여 업데이트가 성공했는지 확인해야 합니다.
답변1
모니터링을 위해 스크립트를 사용하는 ntpd
것은 일반적이지 않습니다. 데몬은 일반적 nagios
으로 . munin
이 도구는 문제가 발생하면 경고를 보낼 수 있습니다. munin
오프셋이 15ms를 초과하면 이메일을 보내드리겠습니다.
일반적으로 서버 중 하나가 실패할 경우 데몬이 서버 간에 선택할 수 있도록 홀수의 서버를 사용해야 합니다. 보통 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
답변2
첫 번째 질문에 대답하기 위해 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>
당신이 일반적으로 관심을 갖는 숫자는 로컬 시계가 서버 시계와 다른 초 수인 "오프셋"이라고 생각합니다.
"peers" 명령의 상태 페이지 man
:ntpdc
the current estimated delay, offset and dispersion of the peer, all in seconds.
따라서 "오프셋"은 초 단위입니다.
ntpdc
더 이상 사용되지 않고 로 대체된 것 같습니다 ntpq
. ntpq
밀리초 단위로 "오프셋"을 제공하는 "peers" 대화형 명령이 있습니다. 내 Redhat 서버에는 주의가 필요합니다 ntpdc
.ntpq
답변3
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
답변4
또한 @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`