LoginSignup
22
19

More than 5 years have passed since last update.

Windowsでのサービス監視

Posted at

Windows(サーバなどは特に)でも、サービスの起動状態を監視したいことが結構ある。
日に1回とか数回の実行でよく、監視を行うバッチファイルをタスクで実行し、サービスが起動していなければメールを送信するというレベルであれば、大がかりな監視システムやエージェントを入れ無くても、特に投資も無く出来る。

サービスのキー名称を調べる

sc queryコマンドを実行すると、起動中のサービスについての情報を得られる。
ただし、管理ツールサービスにて表示されるのは表示名称であって、sc queryの表示のものとは異なる。
scコマンドにおいては、キー名称が必要となる。
表示名称からキー名称を調べるには以下のコマンドでを実行する。

sc getkeyname **表示名称**

sc getkeyname "DHCP Client"
名前 = Dhcp

監視バッチファイル

sc queryの実行結果から対象のサービスのキー名称を検索し、無ければ起動していない、有れば起動しているという判断となる。
検索条件(findstrのところ)は他のサービスのキー名称との兼ね合いで、考慮する。
(Dhcpの他にDhcphogeとかいうサービスが起動していると間違った判断になるので)

chkservice.bat
@ECHO OFF
set dt=""
FOR /F "USEBACKQ" %%i IN (`sc query ^| findstr /i "Dhcp"`) DO @SET DT=%%i
IF %DT%=="" GOTO error
GOTO end
:error
cscript c:¥sysadm¥errmail.vbs
:end

通知メール送信スクリプト

上のerrorラベルのところで指定したエラー通知メールの送信処理をWSHで動かす。
オブジェクトのパラメータについては以下を参照。
@IT:Windows TIPS -- Tips:Windows標準機能とWSHを使ってメールを送信する

errmail.vbs
Set MsgObj = CreateObject("CDO.Message")
MsgObj.From = "alert@example.com"
MsgObj.To = "operator1@example.com,operator2@example.com"
MsgObj.Subject = "DHCP Service error Happend."
MsgObj.TextBody = "DHCP service Stopped." & vbCrLf & Now
MsgObj.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
MsgObj.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "192.168.0.100"
MsgObj.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
MsgObj.Configuration.Fields.Update
MsgObj.Send

タスクを組む

監視バッチファイルをタスクで起動する。
周期やタイミングは状況に合わせて。
※念のため、運用に影響が出ない範囲で、実際にサービスを停止してメールが配信されるか、環境も含めてチェックした方が良いと思われます。

22
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
19