Windows(サーバなどは特に)でも、サービスの起動状態を監視したいことが結構ある。
日に1回とか数回の実行でよく、監視を行うバッチファイルをタスクで実行し、サービスが起動していなければメールを送信するというレベルであれば、大がかりな監視システムやエージェントを入れ無くても、特に投資も無く出来る。
サービスのキー名称を調べる
sc query
コマンドを実行すると、起動中のサービスについての情報を得られる。
ただし、管理ツールのサービスにて表示されるのは表示名称であって、sc query
の表示のものとは異なる。
sc
コマンドにおいては、キー名称が必要となる。
表示名称からキー名称を調べるには以下のコマンドでを実行する。
sc getkeyname **表示名称**
sc getkeyname "DHCP Client"
名前 = Dhcp
監視バッチファイル
sc query
の実行結果から対象のサービスのキー名称を検索し、無ければ起動していない、有れば起動しているという判断となる。
検索条件(findstrのところ)は他のサービスのキー名称との兼ね合いで、考慮する。
(Dhcpの他にDhcphogeとかいうサービスが起動していると間違った判断になるので)
@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を使ってメールを送信する
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
タスクを組む
監視バッチファイルをタスクで起動する。
周期やタイミングは状況に合わせて。
※念のため、運用に影響が出ない範囲で、実際にサービスを停止してメールが配信されるか、環境も含めてチェックした方が良いと思われます。