SCOMには「プロセス監視」の管理パックテンプレートがあり、お手軽にプロセスの監視が出来ます。
結構細かい指定がコンソールから簡単に行えるので、重宝します。
が、そこはSCOM、やはりエージェントを導入していないとこれは動作しません。
エージェントが導入されていない、エージェントレス監視のサーバーは監視対象外となります。
これは、管理パックをエクスポートしてRemotable属性の値を確認することでも確認できます。
<UnitMonitor ID=”ProcessMonitoring_9fe2f4125b6e43749a8a67c344817b31.ProcessInstanceCountMonitor” Accessibility=”Public” Enabled=”true” Target=”ProcessMonitoring_9fe2f4125b6e43749a8a67c344817b31MonitoredProcess” ParentMonitorID=”Health!System.Health.AvailabilityState” Remotable=”false” Priority=”Normal” TypeID=”MicrosoftSystemCenterProcessMonitoringLibrary!Microsoft.SystemCenter.Process.ProcessInstanceCountMonitorType” ConfirmDelivery=”false”>
<Category>AvailabilityHealth</Category>
<AlertSettings AlertMessage=”ProcessMonitoring_9fe2f4125b6e43749a8a67c344817b31.ProcessMonitoring.ProcessInstanceCountOutsideRange.AlertMessage”>
<AlertOnState>Error</AlertOnState>
<AutoResolve>true</AutoResolve>
<AlertPriority>Normal</AlertPriority>
<AlertSeverity>Error</AlertSeverity>
<AlertParameters>
<AlertParameter1>$Data[Default=’0′]/Context/DataItem/Item0Context/DataItem/ProcessInformations/ProcessInformation[./ProcessName =’cmd.exe’]/ActiveInstanceCount$</AlertParameter1>
</AlertParameters>
</AlertSettings>
<OperationalStates>
<OperationalState ID=”OK” MonitorTypeStateID=”InsideRangeState” HealthState=”Success” />
<OperationalState ID=”Error” MonitorTypeStateID=”OutsideRangeState” HealthState=”Error” />
</OperationalStates>
<Configuration>
<ProcessName>cmd.exe</ProcessName>
<Frequency>60</Frequency>
<MinInstanceCount>1</MinInstanceCount>
<MaxInstanceCount>5</MaxInstanceCount>
<InstanceCountOutOfRangeTimeThresholdInSeconds>60</InstanceCountOutOfRangeTimeThresholdInSeconds>
</Configuration>
</UnitMonitor>
むりやりこれをRemotable=”true”と書き換えてしまってインポートし直すと、監視できているように見えますが、実際にはきちんと動作していません。
監視対象にはなっています。しかし、cmd.exeの数はエージェントレスで監視しているサーバーのものではない数(監視エージェント上のプロセスの数)が戻ってきてしまい、正常に監視できていません。この方法は使えません。
そもそもSCOMは思想的にも機能的にもエージェントを入れて監視するのが有効なので、無理にエージェントレスで頑張る必要は無いですし、お勧めできません。
ですが、やろうと思えば出来るよ・・・ということの一例としてスクリプトを自分で書いてcmd.exeのプロセスの数をリモートからモニターする管理パックを作成してみます。
ユニットモニターを作成します。
スクリプトを記述します。
‘===================================================================================
‘ AUTHOR: Masahiko Ebisuda
‘ Script Name: ProcessMonitor.vbs
‘ DATE: 2015/07/13
‘ Version: 1.0
‘ COMMENT: Script to monitor process number.
‘===================================================================================
Option Explicit
SetLocale(“en-us”)
Dim ProcessName, objWMIService,colProcesses, objProcess, ComputerName, count
Dim oAPI, oBag, oInst
ProcessName = “cmd.exe”
ComputerName = Wscript.Arguments.Item(0)
Set oAPI = CreateObject(“MOM.ScriptAPI”)
Set objWMIService = GetObject(“winmgmts:{impersonationLevel=impersonate}!\\” & ComputerName & “\root\cimv2”)
Set colProcesses = objWMIService.ExecQuery(“SELECT * FROM Win32_Process where Caption=’” & ProcessName & “‘”,,48)
count = 0
For Each objProcess in colProcesses
count = count + 1
Next
Set oBag = oAPI.CreatePropertyBag()
oBag.AddValue “ProcessCount”, count
oAPI.AddItem(oBag)
oAPI.Return(oBag)
パラメーターを定義します。
Property[@Name=’ProcessCount’]という形でPropertyBagの中に入れた値が参照できます。
これでユニットモニターが作成できました。
きちんとヘルプエクスプローラーでも表示され、リモートからも監視が可能となりました。
アラートもきちんと出力されました。
しかし、繰り返しになりますが、この方法はお勧めはできません。エージェントを入れるべきです。
どうしても…という時のみ検討してみてください。
Leave a Reply