WindowsサーバのメンテナンスでOSを再起動する事はよくあると思います。
OS再起動後に動いていないサービスがあった時は、OS再起動前のサービス状態と見比べる必要がありますが、人の目だと大変です。
今回はサービス状態の比較をバッチで行う方法を説明します。
- WindowsOSのメンテナンスを行うがサービスの確認に不安がある
- OS再起動前は起動状態で、OS再起動後は停止状態になっているサービスを知りたい
- サービスをファイルに出力してFCコマンドで比較したがずれてしまった
こんな方に読んでもらいたいです。
具体的なやり方
OS再起動前とOS再起動後にサービス状態をファイルに出力しておく。
メモ帳を開いてこの後に説明するプログラムをコピペしてサービス比較.batというファイル名で保存します。
後は、そのファイルをダブルクリックすればサービスの比較を自動でやって、異常があれば画面に表示してくれます。
バッチファイルを作って動かす
コピーするプログラム
この下に書いてあるプログラムをコピーしてメモ帳に貼り付けます。
ファイル名をサービス比較.batとしてデスクトップへ保存します。
@echo off rem サービス停止情報のファイル取得方法はWindows PowerShellで下記2行のコマンドを実行する rem $now = Get-Date -Format "yyyyMMdd" rem get-wmiobject win32_service | select Name,State | Where-Object {$_.State -eq "Stopped" } > service-before_$now.log rem 「service-before_yyyymmdd.log」のファイル名を準備 set filename-before=service-before_%date:~0,4%%date:~5,2%%date:~8,2%.log set filename-after=service-after_%date:~0,4%%date:~5,2%%date:~8,2%.log rem 異常時のメッセージ set NGMSG1=「 set NGMSG2=」は元々起動してましたが、現在は停止状態です。 rem 異常が無かった場合に最後に表示させるメッセージ set OKMSG1=サービス状態は正常です。 rem 比較した結果を格納する。(一致=true 不一致=false) set MATCHFLAG= rem 一致しなかったサービス名を一時的に格納する。 set NGSERVICE= rem 最終的な結果を格納する。(正常=true 異常=false) set RESULT= rem for内での変数処理用 setlocal enabledelayedexpansion for /f "delims=" %%a in (%filename-after%) do ( set MATCHFLAG=false for /f "delims=" %%b in (%filename-before%) do ( if %%a==%%b ( set MATCHFLAG=true ) else ( set NGSERVICE=%%a ) ) if not !MATCHFLAG!==true ( set MSG=%NGMSG1%!NGSERVICE!%NGMSG2% echo !MSG! set RESULT=false ) ) if not !RESULT!==false ( echo !OKMSG1! ) endlocal pause
この2行はファイルを読み込んで、読み込んだ行を%%aまたは%%bに入れる処理を繰り返します。
- for /f “delims=” %%a in (%filename-after%) do (
- for /f “delims=” %%b in (%filename-before%) do (
この%%aと%%bを比較する事でその行が存在しているか判断するようになっています。
比較するファイルを作成する
サービス状態のファイル出力方法はいくつかあると思いますが、今回はWindowsPowerShellの「get-wmiobject win32_service」を使います。
ファイル名を当日日付にする為、日付用の変数を準備する。
Name State ---- ----- AJRouter Stopped AppIDSvc Stopped AppMgmt Stopped ALG Stopped
私のPCで実行した結果ですが、かなり多かったのでテスト用に上4つだけに絞りました。
続けて再起動後のサービス一覧も取得します。
取得するコマンドは同じですが、書き出すファイル名の部分だけbeforeからafterに変更しています。
ファイル名を当日日付にする為、日付用の変数を準備する。
Name State ---- ----- AdobeFlashPlayerUpdateSvc Stopped AJRouter Stopped ALG Stopped AppIDSvc Stopped AppMgmt Stopped
同じだと比較の効果が分からないのでわざと場所をずらしたり、サービスを追加したりしています。
- ALG 表示されている場所を5番目から3番目へ移動
- AdobeFlashPlayerUpdateSvc 新たに追加
実行する
作成したサービス比較.batをダブルクリックします。
コマンドプロンプトが起動して結果が表示されました。
続行するには何かキーを押してください . . .
想定通りの動きです。
AdobeFlashPlayerUpdateSvcはOS再起動前のファイルにストップとして存在しなかったのに、OS再起動後のファイルにはストップとして存在していたので再起動によって止まってしまった事がわかります。
また順番を変えたALGについてはOS再起動前も後もストップの状態なので異常にはなっていません。
サービスの状態に異常がない場合は下記表示になります。
続行するには何かキーを押してください . . .
ちなみにこの2つのファイルをFCコマンドで比較してみました。
C:\Users\mizusibuki>fc service-before_20220419.log service-after_20220419.log ファイル service-before_20220419.log と SERVICE-AFTER_20220419.LOG を比較しています ***** service-before_20220419.log ---- ----- AJRouter Stopped AppIDSvc Stopped ***** SERVICE-AFTER_20220419.LOG ---- ----- AdobeFlashPlayerUpdateSvc Stopped AJRouter Stopped ALG Stopped AppIDSvc Stopped ***** ***** service-before_20220419.log ALG Stopped ***** SERVICE-AFTER_20220419.LOG *****
差異があることはわかりますが、かなり見にくいです。
AdobeFlashPlayerUpdateSvcに異常がある事やALGの行がずれているだけという部分はわかりません。
やった事のまとめ
OS再起動前後にPowerShellでサービス状態をファイルに出力して、バッチファイルを実行する事で、異常のあるサービスを見つける事ができました。
作業するサーバが数台であれば目視で確認も可能だと思いますが、サーバ追加によって数十台になってくると集中力に限界がくると思います。
最初にバッチファイルを作っておくことで、作業が楽で正確になっていくのでぜひとりいれてみましょう。