2013/08/28

[Windows]監視スクリプトを書いてみた(3/5) サービス監視

ApacheやらMySQLのサービスが落ちてないかなどを監視するのを自分でチェックして異常があったら発報する仕組みが必要だと思ってました。
サードパーティに頼らず、WindowsOSの機能だけで作ってみたかったので、ほぼVBScriptだけでくみ上げてみました。

そんなマゾヒズム感全開なエントリがこちらです。

今回は第3回です。
  1. 処理フロー
  2. メール送信
  3. サービス監視(今回)
  4. ポート監視
  5. MySQLレプリケーション監視



.

内容

引数で指定したサービスが開始の状態になっているかをチェックします。
WindowsだとApacheのサービスがいつのまにか落ちてるなんてことが・・・私の場合はありました。
通常営業時間中であればすぐに周りが騒ぎ始めるのですぐ気づくんですが、夜間とかはまぁ気づかないのでご迷惑をおかけしてしまうわけで、このシリーズを書くことになったきっかけです。

使い方

下のVBScriptと第2回で紹介したsendMail.vbsを同じディレクトリに置き、さらにバッチファイルを置いて以下のように記述します。
Call watchService.vbs "Apache2.2"
通常「.vbs」は自動で探しに行く拡張子なので、「watchService.vbs」は「watchService」に省略可能ですが、仮に同じディレクトリにwatchService.batとかあるとそちらを先に見に行ってしまうので注意してください。(末尾に余談記載あり)
複数のサービスを監視したい場合は以下のように記載します。
Call watchService.vbs "Apache2.2"
Call watchService.vbs "mysqld"
Call watchService.vbs "mongod"


ポイント

VBScriptでちゃんとやる方法もあるとは思うのですが、スクリプトの中でコマンドプロンプトを呼び出してNETコマンドを実行し、その結果の標準出力を解析して状態を確認するという、かなりの手抜きをしています。
(なお、この手法はこのシリーズ共通です。)

使っているコマンドは
NET START|FIND /i サービス表示名
です。
これを分解すると、
NET START
で開始されているサービスの一覧を取得します。ここで一覧されるのはサービス名ではなく、サービス表示名であることにご注意ください。コマンドプロンプトで実行するとこんな感じで出力されます。


で、これをパイプで
FIND /i サービス表示名
に渡して絞り込みます。上記のものを「epson」で絞り込むとこうなります。「/i」は「大文字小文字を区別しない」オプション指定です。

みていただければわかるとおり、FINDは部分一致での検索なので、例えば mysqld と mysqld_slave というサービス表示名があったときに mysqldで検索しても両方ヒットして2行出力されてしまいます。
そこでその後でこの出力の中から完全一致の行を見つけるために正規表現で検索しています。

それから、フラグファイルやログファイルにこのサービス名を使っているのですが、サービス表示名にはスペースが使われていることがあります。
これをそのままファイル名に使うと後が面倒なので、フラグファイル名とログファイル名ではスペースを_に置き換えています。
例) 「World Wide Web Publishing Service」 → 「World_Wide_Web_Publishing_Service.log」


ログファイルは月ごとにローテーションさせています。好きに変えてください。このシリーズ共通です。
メール送信はこのシリーズ第二回で紹介したsendMail.vbsを使います。このシリーズ共通です。


余談

自動で探しに行く拡張子と順番は
ECHO %PATHEXT%
のコマンドで確認できます。

これはシステム環境変数で、管理者権限があれば変更できます。


さて、次回はポート監視です。

.

3 件のコメント:

  1. 初めまして。大変参考ななりました!
    Win2008のタスクスケジューラで実行したいのですが「0x1」でエラーが出て実行できません。
    手動ではOKで、タスクスケジューラではNGです。
    何か対策はありますでしょうか?

    返信削除
    返信
    1. こんにちは。
      私もよくそういったトラブルに悩まされます。
      そんな時に私が切り分けとして見てみるのは、以下の箇所です。
      ・タスクスケジューラの「セキュリティオプション」を変えてみる。
      ・タスクスケジューラの「構成」を変えてみる(OS種別)
      ・バッチファイル/スクリプトを一行ずつコメントアウトして成功するパターンを探す
      直接的な回答になっていませんが、ご確認いただければと思います。

      削除
    2. ありがとうございます。
      解決しました。

      基本的なことを見をとしてました。

      タスクスケジューラの設定は変更なしで、「batファイルのwatchService.vbs」をフルパスで記述したら動作しました。

      ありがとうございました。

      削除