treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

(2/3)Windowsサービス監視

昨日「(1/3)Windowsサービス監視」の続きをご報告です。
前回で簡単な監視バッチを考えてみました。
今回は前回を踏まえて、もう少しバッチファイルを肉付けしていくようにします。

※本記事のバッチファイル等、ご利用の際は無保証・自己責任となります。

前回のバッチの実行結果

実際に実行した画面が下図です。
図:scコマンドの実行と、バッチファイルを実行した画面

f:id:treedown:20160731184431p:plain

「sc query "Dhcp"」の実行結果はサービスの現在の情報を画面表示してくれます。
でもちょっとお待ちを。

注:サービス名の指定について

サービス名はservices.msc画面の各サービスのプロパティ(全般タブ)から、サービス名を確認して指定します。DHCP Clientサービスでいえば「Dhcp」がサービス名で「DHCP Client」はあくまでサービスの表示名でしかありません。scコマンドで指定できるのはサービス名なので、表示名を指定すると、
----------------------------------------------
C:\Users\User1>sc query "DHCP Client"
[SC] EnumQueryServicesStatus:OpenService FAILED 1060:

指定されたサービスはインストールされたサービスとして存在しません。
----------------------------------------------
と、このようにエラーになってしまいます。正しいサービス名を指定すると、
----------------------------------------------
C:\Users\User1>sc query "Dhcp"

SERVICE_NAME: Dhcp
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
----------------------------------------------
このようにscコマンドで取得できるサービスの状態が画面に表示されます。
たとえば、プリンタサーバでPrint Spoolerサービスを監視するときは、サービス名である「Spooler」と指定し、
----------------------------------------------
C:\Users\User1>sc query "Spooler"

SERVICE_NAME: Spooler
TYPE : 110 WIN32_OWN_PROCESS (interactive)
STATE : 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

C:\Users\User1>
----------------------------------------------
とすることでサービスの稼働状態を確認することができます。

scコマンドの結果を活用

このscコマンドで取得するサービスステータスをパイプシンボルで連結したfindstrコマンドで「STATE」と「RUNNING」がある行を表示条件とすることで、バッチファイル実行結果のように
「 STATE : 4 RUNNING」
だけが表示されます。
「echo %ERRORLEVEL%」行で一応環境変数ERRORLEVELを表示させます。
if文で分岐してそれぞれの処理を実行します。(ここではechoでメッセージ表示)
処理が実行したら、バッチファイルは終了します。

実行結果例:
1)DHCP Clientサービスが実行されているときにはこのように出力されます。
----------------------------------------------
C:\Users\Public\Documents>sctest.bat
STATE : 4 RUNNING
0
実行は不要=0

C:\Users\Public\Documents>
----------------------------------------------
2)DHCP Clientサービスが停止しているときにはこのように出力されます。
----------------------------------------------
C:\Users\Public\Documents>sctest.bat
1
いまsvcstartを実行=1

C:\Users\Public\Documents>
----------------------------------------------
環境変数ERRORLEVELによって、if文の処理分岐が動作していることが見て取れます。

ようやくバッチファイル

ここまでが理解できたところで、バッチファイルをちょっと格好つけていきます。
まず監視するサービスは変数にして、先頭に記述するようにして、汎用性を持たせます。
ログファイルを記録するようにして動作履歴が後から参照できるようにします。
ログファイルを変数指定でログの出力パスを参照させるようにして、ログの保管場所も汎用性を持たせます。(ただし指定したフォルダは予め作成しておくようにしてください。)
さらにサービスが停止していれば、自動的にサービスをスタートするようコマンドを仕掛けておきます。
※ただし、サービスをスタートするコマンドを処理として追加することによって、このバッチファイルの動作を確認するときでも管理者権限でのコマンドプロンプト上から実行する必要が出てきます。(コマンドのウィンドウタイトルに「管理者:」と表示されていれば管理者権限でコマンドプロンプトが実行されている状態です。)
----------------------------------------------
@echo off
rem 監視するサービス名
set SERVICE=Dhcp
rem ログの出力パス
set LOG=C:\temp\svc.log
rem サービスの起動確認
sc.exe query "%SERVICE%" | findstr STATE | findstr RUNNING > nul
if %ERRORLEVEL% == 1 goto svcstart
if %ERRORLEVEL% == 0 goto noexec

:svcstart
echo ---------- >> %LOG%
date /t >> %LOG%
time /t >> %LOG%
rem 実行
rem echo "%SERVICE% isn't running" >> %LOG%
echo "start ServiceNAMR=%SERVICE% Service" >> %LOG%
net start "%SERVICE%" >> %LOG%
echo 処理終了時刻 >> %LOG%
time /t >> %LOG%
echo. >> %LOG%
goto end

:noexec
echo ---------- >> %LOG%
date /t >> %LOG%
time /t >> %LOG%
echo "%SERVICE% is running" >> %LOG%
goto end

:end
rem 後処理
set SERVICE=
set LOG=

----------------------------------------------

このバッチファイルの実行結果と解説は明日に続きます。