treedown’s Report

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

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

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

簡単な監視をするバッチファイルを考えてみましょうという主旨のご報告です。
監視、と一言でいうと結構大仰な感じですが、ちっちゃなところから監視をスタートすることも可能です。
お盆休暇という長期休暇を控えて、休暇前に監視をしておきたい、と考えている方も多いかと思います。まずは簡単な監視を見てみましょう。

※本記事のバッチファイル等、ご利用の際は無保証・自己責任となります。
昨日監視の記事<性能監視と死活監視は似て異なる - treedown’s Report>をご報告しました。バッチファイルでWindowsサービスを実際に監視してみます。

監視するためには

サービス監視、というのは監視の第一歩として運用管理上欲しくなるのですが、専用のエージェントを用意して監視サーバを用立てる必要があります。
(費用の多寡はさておき)各監視対象にエージェントをインストールする、というのも労力と極力インストールをしたくない、というサーバの要件に阻まれることもありますし、監視サーバを社内インフラに導入するというのはなかなかの労力が必要になる作業となりがちです。

やりたいことは、サーバ単体でサービスを監視できればそれでよい、というレベルの監視にも関わらず、大規模に監視サーバ&エージェントを導入する向きには他のインフラ・アプリ担当者からの抵抗も(多少なりとも)予想されます。

バッチファイル化

監視したい、でも大規模には入れたくない、こうなるとWindowsの標準機能で実現するよりほかはない、ということで、今回もバッチファイルでこのあたりを考えてみることにしました。

死活監視と言えばping監視というくらい、疎通確認としてのpingはメジャーなツールです。
ではサービス監視はどのコマンドを使うのか?実はあまり有名ではないコマンドを使用します。
このサービス監視(正確にはサービスの状態を収集する)コマンドは「sc」コマンドを使います。死活監視の中でも「サービス監視」は有名なのですが、実際にサービス監視で使用するコマンドは全く有名ではないのが現実です。(なぜでしょうね?)

おっと、話が脱線するまえに、バッチファイルですね。

具体的には

  1. サービスの状態確認
  2. サービスが停止されていたら、自動的にサービススタート
  3. 実行ログをテキストファイルに記録する

という動きを作ってみます。
実際には実行ログはメールアラートのほうが監視っぽさが出て望ましい、といえます。とはいえ、今回はメールアラートまでをスコープに入れると内容が複雑化してしまうので、メールアラートはご勘弁ください。

バッチファイル

まずは、基本動作の確認をします。「DHCP Client」サービスを監視する、という例で話を進めることにします。
以下のバッチをご覧ください。
----------------------------------------------
@echo off
sc query "Dhcp" | findstr STATE | findstr RUNNING
echo %ERRORLEVEL%
if %ERRORLEVEL% == 1 goto svcstart
if %ERRORLEVEL% == 0 goto noexec
:svcstart
echo いまsvcstartを実行=1
goto end
:noexec
echo 実行は不要=0
goto end
:end
----------------------------------------------
scコマンドのqueryサブコマンドのセット「sc query」コマンドでサービスの状態をコンソール表示して確認できます。
|(パイプシンボル)でfindstrコマンドをつなげて、LinuxのGrepと似たテキスト抽出を行います。
scコマンドの実行結果を元に環境変数「%ERRORLEVEL%」の返り値を拾って実行したい処理に分岐させます。