treedown’s Report

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

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

バッチファイルでWindowsサービス監視2020年版

以前の記事で作成したバッチファイルを現在のWindows環境に合わせて修正したのでご報告です。

scコマンドでWindowsサービス監視していたバッチファイルの件。

以前のバッチファイルとは

以前にscコマンドを利用してWindowsサービスを監視するバッチファイルを作成していました。

f:id:treedown:20200406172201p:plain
時は流れてWindows10とかWindows Server 2016/2019の時代になって、あのバッチファイルもうちょっと良い感じにできないかと模索。

■バッチファイルの元ネタ:

blog.treedown.net

■考え方

blog.treedown.net

上記の記事で文字列の抽出に「findstr」コマンドを利用していたのですが、このコマンドを今風にfindコマンドに編集、ただ最初findstrコマンドは利用できなくなったと勘違いしていたのですが、findstrコマンドはWindows10でもまだ現役、利用できることが分りました。(じゃあ、編集しなくてよかったか)

ログファイルをもうちょっと見やすくしてみる

ログファイルはなんかこう、改行が多くてイマイチな見た目でした。
これをLinuxのログファイルっぽい感じの並びになるよう改善してみます。

  • 日付を綺麗に(Linuxのsyslogの表示に近くなるように)
  • 実行結果を変数に入れて一行表示に
  • サービスをスタートしたときに成功と失敗の判定とログ記録を実行

をテーマとしてやってみました。

改善点

やはりログ表示の部分になる「net start "%SERVICE%"」付近に改善の余地があります。
以前はdateコマンドとtimeコマンドを連続で実行して単純に(手抜き)ファイルに記述するようにしていましたが、ここをもうちょっとうまくログっぽく記録することができそうです。
日付と時間を変数に入れ、その変数を連続してEcho出力すれば思っていたことが出来るような気がしていました。あと、Linuxのsyslogでは日付・時間の後にコンピュータ名が入るのがお約束(たぶんrsyslogで他のマシンのログを受けるケースがあるからだと思うけど)です。
この辺も環境変数を使って上手くできそうです。

サービスが落ちていた場合、「net start "%SERVICE%"」コマンドで実行させていますが、最初のscコマンドでのサービス起動確認でERRORLEVELの判定をしているのだから、net start後にもERRORLEVELの判定を入れてサービスがバッチファイルから自動的に起動出来たかどうかと言う点をログに記録できた方が(後で動作を確認する際の記録としては)便利に思えます。
そこで、問題ないときには「Service started」と表記し、問題があった(かもしれない)時には「Service Unexpected error: service may not have started.」表示が記録されるようにしてみました。

バッチファイル

上記改善点を踏まえて、バッチファイルはこのようになりました。なお前回と違ってPCの動作に影響しないように監視対象をDhcpからダミーのPSEXESVCサービスに変えています。(ココを書き換えれば、監視したいサービスを監視することができます。)
--------------------------------------------------------------
@echo off
rem 監視するサービス名
set SERVICE=PSEXESVC
rem ログの出力パス
set LOG=C:\temp\svc.log
rem 今日の日付取得
set Today=%date:~0,4%-%date:~5,2%-%date:~8,2%
rem サービスの起動確認
sc.exe query "%SERVICE%" | find "STATE" | find "RUNNING" > nul
if %ERRORLEVEL% == 1 goto svcstart
if %ERRORLEVEL% == 0 goto noexec

:svcstart
echo %Today% %TIME% %COMPUTERNAME% "%SERVICE%" isn't running. >> %LOG%
echo %Today% %TIME% %COMPUTERNAME% "start ServiceNAME=%SERVICE% Service" >> %LOG%
net start "%SERVICE%"
if %ERRORLEVEL% equ 0 (
echo %Today% %TIME% %COMPUTERNAME% "%SERVICE%"Service started. >> %LOG%
) else (
echo %Today% %TIME% %COMPUTERNAME% "%SERVICE%"Service Unexpected error: service may not have started. >> %LOG%
)
goto end

:noexec
echo %Today% %TIME% %COMPUTERNAME% %SERVICE% is running. >> %LOG%
goto end

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

なんだか以前よりやけにすっきりしたように思えます。行数が少なくなったような…。

ログ表示

ログ表示は、(サンプルですが)こんな感じ。一時間おきに実行して、途中でわざとダミーであるPSEXESVCサービスを停止し、動作を確認しました。
--------------------------------------------------------------
2020-04-02 11:31:51.64 TCM92P-01 PSEXESVC is running.
2020-04-02 12:31:55.64 TCM92P-01 PSEXESVC is running.
2020-04-02 13:31:58.62 TCM92P-01 PSEXESVC is running.
2020-04-02 14:32:39.85 TCM92P-01 PSEXESVC is running.
2020-04-02 15:32:49.87 TCM92P-01 "PSEXESVC" isn't running.
2020-04-02 15:32:49.87 TCM92P-01 "start ServiceNAME=PSEXESVC Service"
2020-04-02 15:32:49.95 TCM92P-01 "PSEXESVC"Service Unexpected error: service may not have started.
2020-04-02 16:32:55.70 TCM92P-01 "PSEXESVC" isn't running.
2020-04-02 16:32:55.71 TCM92P-01 "start ServiceNAME=PSEXESVC Service"
2020-04-02 16:32:57.82 TCM92P-01 "PSEXESVC"Service started.
2020-04-02 17:33:03.82 TCM92P-01 PSEXESVC is running.
--------------------------------------------------------------

サービスが起動していれば、「サービス名 is running.」の一行が記録されています。

15:32にサービスの停止状態を検出しています。そこで、net startコマンドにて起動を試みていますが、

f:id:treedown:20200406172004p:plain
こんな感じで権限が不足していてnet startコマンドが正常に完了していない時のログ表記になっています。
その一時間後16:32からは、サービスを実行可能な権限で実行し、

f:id:treedown:20200406172019p:plain
このように正常にサービスを起動出来ているときの表記になっています。