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 满足这些规则。 让我们通过以下方式稍微扩展一下此示例
- 向“默认网站”的默认页发出请求。
- 查询工作进程的 PID 是否是处理请求的 PID。
- 回收应用程序池。
- 再次请求 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 应用程序池和站点的状态。 你了解了如何启动和停止它们。 你还了解了如何查看工作进程和当前正在执行的请求。