PowerShell 管理单元:运行时数据

作者:Thomas Deml

前面的演练演示了如何查询和更改 IIS 配置设置。 然而,还有一个尚未探索的领域:运行时数据。

介绍

情况发生变化,IIS 不同了。 站点启动或停止、应用程序池回收或超时、请求传入并发送响应、AppDomain 生成或关闭。 IIS 实现一个名为 RSCA(运行时状态和控制 API)的界面,可用于监视系统中发生的情况。

IIS PowerShell 管理单元使用此界面,通过 IIS 管理单元命名空间公开其部分数据。 站点和应用程序池的状态可通过 Get-WebItemState、Start-WebItem、Stop-WebItem 和 Restart-WebItem cmdlet 进行配置。 运行时状态(如当前正在运行的工作进程、当前正在执行的请求和加载的 AppDomain)通过 IIS 命名空间公开。

本演练使用在前面的演练中创建的站点、应用程序和虚拟目录。

站点和应用程序池状态

我们首先查询网站的状态。

站点状态

PS IIS:\> cd Sites
PS IIS:\Sites> Get-WebItemState IIS:\Sites\DemoSite
Started

可以使用 Stop-WebItem cmdlet 停止 DemoSite:

PS IIS:\Sites> Stop-WebItem DemoSite
PS IIS:\Sites> Get-WebItemState IIS:\Sites\DemoSite
Stopped

启动工作相同:

PS IIS:\Sites> Start-WebItem DemoSite
PS IIS:\Sites> Get-WebItemState IIS:\sites\DemoSite
Started

AppPool 状态

我们希望对应用程序池执行相同的操作

PS IIS:\> cd AppPools
PS IIS:\AppPools> Get-WebItemState DemoAppPool
Started
PS IIS:\AppPools> Stop-WebItem DemoAppPool
PS IIS:\AppPools> Get-WebItemState DemoAppPool
Stopped

但是,还可以在 AppPool 节点上读取状态属性。 让我们来看看下一个示例。 打开扬声器,然后执行以下命令:

dir 'iis:\AppPools' | foreach {[void](new-object -com Sapi.SPVoice).Speak("Application Pool State:");}{$poolState = "Application Pool " + $_.Name +" is " + $_.State;$poolState;[void](new-object -com Sapi.SPVoice).Speak($poolState);}

现在再次启动 DemoAppPool:

PS IIS:\AppPools> Start-WebItem DemoAppPool

回收 AppPool

AppPool 的一个不同之处在于其可以回收。 用于回收 AppPool 的 cmdlet 称为 Restart-WebItem,而不是 Recycle-WebItem。 PowerShell 具有非常严格的命名规则,我们必须为 Restart-WebItem 满足这些规则。 让我们通过以下方式稍微扩展一下此示例

  1. 向“默认网站”的默认页发出请求。
  2. 查询工作进程的 PID 是否是处理请求的 PID。
  3. 回收应用程序池。
  4. 再次请求 PID 以确认进程已重启。

1.请求默认页

我们使用 Net.WebClient 类请求 http://localhost/。 我们只是查看响应的长度,而不在屏幕上显示输出。

PS IIS:\AppPools> $response = (new-object Net.WebClient).DownloadString("http://localhost/")
PS IIS:\AppPools> $response.Length
689

2.查询工作进程 PID

假设计算机上没有其他活动网站和应用程序,以下命令应仅返回一个 PID:

PS IIS:\AppPools> get-process w3wp | select processname,id
ProcessName                                                                                      Id
-----------                                                                                      --
w3wp                                                                                           3684

有一种更好的方法来访问工作进程,本演练稍后将使用。

3.回收应用程序池

我们使用 Restart-WebItem cmdlet 回收应用程序池:

PS IIS:\AppPools> Restart-WebItem DefaultAppPool

4.查询工作进程 PID

如果 AppPool 已成功回收,则进程 ID 应已更改。

PS IIS:\AppPools> get-process w3wp | select processname,id
ProcessName                                                                                      Id
-----------                                                                                      --
w3wp                                                                                           5860

工作进程和请求

get-process cmdlet 无法帮助你确定特定工作进程正在为哪个应用程序池提供服务。 但是,这很容易实现:

PS IIS:\AppPools> dir DefaultAppPool\WorkerProcesses
               processId                  Handles                    state StartTime
               ---------                  -------                    ----- ---------
                    6612                      326                        1 3/28/2008 12:20:27 PM

当前正在执行的请求

如果计算机不是生产计算机,则很难查看当前正在执行的请求。 直到你通过 Internet Explorer 发出请求并返回到 PowerShell 控制台时,请求早已消失了。 下面是一个小帮助程序;一个需要很长时间的请求。

Set-Content "$env:systemdrive\inetpub\wwwroot\long.aspx" "<%@ Page language=`"C#`"%><%System.Threading.Thread.Sleep(30000);Response.Write(`"slept for 30 seconds`");%>"

如果要查看当前正在执行的请求,可以键入以下命令(注意:计算机上必须用于 get-item 命令的进程 ID 将有所不同):

PS IIS:\AppPools\DefaultAppPool\WorkerProcesses> dir
Process  State      Handles  Start Time
Id
-------- -----      -------  ----------
6612     Running    737      3/31/2008 8:18:15 AM
PS IIS:\AppPools\DefaultAppPool\WorkerProcesses> (get-item 6612).GetRequests(0).Collection
requestId    : d8000001800000f5
connectionId : d8000001600000f3
verb         : GET
url          : /long.aspx
siteId       : 1

或者,如果要查看自发起请求以来已经过的时间,请执行以下命令:

PS IIS:\AppPools\DefaultAppPool\WorkerProcesses> (get-item 6612).GetRequests(0).Collection | select url,timeElapsed
url                                                                                     timeElapsed
---                                                                                     -----------
/long.aspx                                                                                     2637

总结

完成。 在本演练中,你了解了如何查询 IIS 应用程序池和站点的状态。 你了解了如何启动和停止它们。 你还了解了如何查看工作进程和当前正在执行的请求。