サーバの運用ではシステム時刻がズレていないか確認する必要があります。
必要な事ですが毎回手動でチェックするのは大変です。
この記事は、
- 時刻同期を頻繁に行うのが面倒なので自動化したい
- パソコンの時間が合っているのかワンクリックで確認したい
こんな方に向けて時刻同期をスマートに行う方法を説明します。
時刻同期の確認方法
サーバの時刻は、基準となるサーバを指定してそのサーバに合わせています。
この仕組みをNTPと言います。
ということなので時刻同期が正しいかは、この2つで判断します。
- 最後に時刻同期した一定期間以内
- 基準となるサーバが設定されている
時刻の確認方法はコントロールパネルにある「日付と時刻」を開きます。
インターネット時刻のタブから確認できます。
今回はCUIで確認するのでコマンドプロンプトから「w32tm /query /status」のコマンドを実行して確認します。
NTPコマンドの結果
C:\Users\xxxx>w32tm /query /status
閏インジケーター: 3 (同期未実行) 階層: 0 (未指定) 精度: -23 (ティックごとに 119.209ns) ルート遅延: 0.0131985s ルート分散: 9.3992167s 参照 ID: 0x00000000 (未指定) 最終正常同期時刻: 2021/11/19 1:07:00 ソース: ntp.nict.jp,0x9 ポーリング間隔: 10 (1024s)
いろいろと情報はありますが、まず見る所は2つです。
・最終正常同期時刻
→これが1ヶ月とかだと明らかにダメだとわかります。大体1日以内がOKでしょう。
・ソース
→ここは基準となるサーバが設定されている事を確認します。
どこの誰だかわからない時刻と同期することになってしまいます。
なので設定が消えちゃったりしていないか確認したいです。
見るポイントは2箇所ですが、ぱっと見てそれが正しいのかわかりません。
そこでバッチを使います。
バッチ実行結果
早速ですがバッチの結果はこんな感じになります。
NTP○ 続行するには何かキーを押してください . . .
NTP○と簡潔に表示させることで誰が見てもOKな事がわかります。(スバラシイ!)
チェックしているのは2つでそれぞれsetで条件を書いています。
・同期時刻が指定した許容範囲内になっている
ここの13の数字は「2021/11/19 1:07:00」の左から13番目までを表しています。
どの程度の精度を求めているかによりますが”日”単位で合っていれば良いと考えます。
早見表は下記です。
年(4) 月(7) 日(10) 時(13) 分(16) 秒(19)
今回はここまでですが、許容判定は3時間以内などまだまだ改良の余地はあると思います。
・ソース情報が指定したものと一致している
「ntp.nict.jp,0x9」は参照しているNTPサーバに書き換えてください。
バッチの内容
下記コードをメモ帳に貼り付けて「時刻確認.bat」というファイル名でデスクトップへ保存してください。
ダブルクリックで実行できます。
@echo off rem ※※※※1.条件の指定※※※※ rem NTP起動コマンド「net start w32time」 rem NTP停止コマンド「net stop w32time」 rem NTP同期コマンド「w32tm /resync」 set filename=NTP結果.log set COMMAND=w32tm /query /status set NOW=%date% %time% set SYNCTIME=最終正常同期時刻 rem どこまでチェックするか数字で指定 年(4) 月(7) 日(10) 時(13) 分(16) 秒(19) set CHECKTIME=%NOW:~,12% rem NTPサーバを指定 set SOURCE=ソース: ntp.nict.jp,0x9 rem 成功時のメッセージ set OKMESSAGE=NTP○ rem 失敗時のメッセージ set NGMESSAGE=NTP×(個別に結果を確認してください。) rem ※※※※2.コマンド実行とファイル出力※※※※ echo %COMMAND% > %filename% %COMMAND% >> %filename% rem ※※※※3.ファイル読み込みと条件確認※※※※ for /f "delims=" %%i in (%filename%) do ( rem ソースをチェック echo %%i | find "%SOURCE%" >NUL if not errorlevel 1 ( set source-result=OK ) rem 最終同期時刻をチェック echo %%i | find "%SYNCTIME%" >NUL if not errorlevel 1 ( echo %%i | find "%CHECKTIME%" >NUL if not errorlevel 1 ( set time-result=OK ) ) ) rem ※※※※4.結果出力※※※※ rem ソースと時刻の両方がOKか確認 echo %source-result% | find "OK" > NUL if not errorlevel 1 ( echo %time-result% | find "OK" > NUL if not errorlevel 1 ( echo %OKMESSAGE% goto ENDBAT ) ) echo %NGMESSAGE% :ENDBAT pause
まとめ
事前に基準になるサーバを指定したバッチファイルを作成しておくことで、確認したい時にバッチをダブルクリックすれば○×で表示させることができます。
コマンドプロンプトを開いたり、コマンドを入力する必要もありません。
NTPの確認なんて何も考えずボタン一つで終わらせてやりましょう。