![如何使用 WMI 监控 IIS 7.5 应用程序池?](https://linux22.com/image/597406/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20WMI%20%E7%9B%91%E6%8E%A7%20IIS%207.5%20%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%B1%A0%EF%BC%9F.png)
我目前在 Server 2008 R2 上的负载平衡 IIS 群集 (NLB) 中有一个应用程序。此应用程序利用了一些旧式数据库访问代码,这些代码偶尔会失败,从而导致应用程序池被禁用。
我想放置一个 WMI 事件观察器来监视应用程序池状态的变化(欢迎其他建议),如果应用程序池进入停止状态,它将重新启动它。
这是一种临时的解决方法,直到可以推送新代码为止,但必须经过 Dev/QA/UAT 周期。
root\webadministration 命名空间中有一个用于 ApplicationPool 的 WMI 类,但是为了获取状态,您必须调用该对象上的 GetState 方法,因此我不确定如何使用 WMI 事件来监视该状态。
答案1
您可以使用内置事件日志监控来执行此操作。
如果应用程序池由于快速失败保护而关闭,则系统事件日志中可能会出现如下事件 ID 5002:
“由于为应用程序池提供服务的进程出现一系列故障,应用程序池‘AppPoolName’将被自动禁用。”
为自定义事件日志触发器创建计划任务。手动 XML 查询如下所示:
<QueryList>
<Query Id="0" Path="System">
<Select Path="System">*[System[Provider[@Name='Microsoft-Windows-WAS'] and (EventID=5002)]]
and *[EventData[Data[@Name='AppPoolID'] and (Data='YourAppPoolFriendlyName')]]</Select>
</Query>
</QueryList>
您的计划任务操作可以是运行 appcmd 的脚本来重新启动特定的应用程序池。
appcmd recycle apppool /?
Recycle application pool
APPCMD recycle APPPOOL <identifier> <-parameter1:value1 ...>
Recycles the specified application pool, recycling its the worker processes.
The exact application pool identifier must be provided and must resolve to an
existing application pool.
Supported parameters:
identifier (required)
Application pool name of the application pool to recycle
/apppool.name
Application pool name of the application pool to recycle (same as
identifier)
Examples:
appcmd recycle apppool "MyAppPool"
Recycle the application pool "MyAppPool".
如果同一台服务器上有多个应用程序池,则可能需要细化 XML 过滤器以指定应用程序池 ID。以下是示例事件 XML 文本:
- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
<Provider Name="Microsoft-Windows-WAS" Guid="{524B5D04-133C-4A62-8362-64E8EDB9CE40}" EventSourceName="WAS" />
<EventID Qualifiers="49152">5002</EventID>
<Version>0</Version>
<Level>2</Level>
<Task>0</Task>
<Opcode>0</Opcode>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2012-10-01T19:41:43.000000000Z" />
<EventRecordID>408764</EventRecordID>
<Correlation />
<Execution ProcessID="0" ThreadID="0" />
<Channel>System</Channel>
<Computer>WEBSERVERNAME.company.com</Computer>
<Security />
</System>
- <EventData>
<Data Name="AppPoolID">YourAppPoolFriendlyName</Data>
<Binary />
</EventData>
</Event>
有关事件日志高级过滤的信息:
https://blogs.technet.com/b/askds/archive/2011/09/26/advanced-xml-filtering-in-the-windows-event-viewer.aspx
使用 APPCMD 回收应用程序池:
http://technet.microsoft.com/en-us/library/cc770764%28v=ws.10%29.aspx
答案2
仅供参考,如果它因为快速故障转移保护而失败,你可以禁用它,而不是小心翼翼地绕过它: