【翻譯】使用PowerShell獲取網站執行時資料

weixin_34377065發表於2009-01-05

     原文連結:PowerShell Provider: Run-time Data

 

介紹

     站點的啟動,停止, 應用程式池的回後或過期(time out), 接受的請求和傳送的響應, AppDomains(應用程式域) 的大量

生成和關閉. IIS7 實現了一個所謂的 RSCA 介面(run-time state and control API) ,該介面允許您監視當前系統正在做的

工作.

     IIS 7.0 PowerShell Provider 使用該介面並以IIS Provider 名空間來暴露其中一些資料資訊. 通過Get-WebItemState,

Start-WebItem, Stop-WebItem 和 Restart-WebItem 等cmdlets來配置站點和應用程式池的狀態. 通過IIS 名空間來暴露

出來的執行時狀態比如:當前執行的工作者程式,當前執行的請求和被載入的應用程式域(loaded AppDomains )等.

     本文使用的站點, applications 和虛擬目錄在前一篇文章中已進行了建立.

站點和應用程式池狀態

      開始查詢web站點的狀態.

站點狀態

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

 

     使用 Stop-WebItem cmdlet 來停止站點:

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

應用程式池狀態

      我們對應用程式池也施加相同操作:

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


 

      除此之外,您也可從 AppPools 結點中獲取這些狀態屬性. 下面我們做一個有趣的例子. 開啟喇叭(電腦的聲音)並執行

下面命令列(注:此時系統會用語音方式提示應用程式池被啟動):

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

回收應用程式池

    應用程式池的不同之處(與站點等相比)在於它們可以被回收(recycled). 執行這個任務的 cmdlet 是:

Restart-WebItem (不是Recycle-WebItem). PowerShell 有著非常嚴格的命名規則,因此我們須使用

Restart-WebItem. 我們使用下面內容來擴充套件一下我們的例子:

  1. 建立一個對 'Default Web Site' 站頁預設頁面的請求
  2. 查詢處理當前請求的工作者程式(worker process )的 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. 查詢工作者程式(Worker Process) PID

    假設當前機器上沒有其他正在執行的站點和應用,下面的命令列僅會返回一個:

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

ProcessName                             Id
-----------                             --
w3wp                                   
3684

     There is a better way to get to worker processes, handled a little later in this walkthrough.

3. 回收應用程式池

    我們使用 Restart-WebItem cmdlet 來回疏通應用程式池:

PS IIS:\AppPools> Restart-WebItem DefaultAppPool

 

4. 查詢工作者程式的 PID

    如果成功地回收了應用程式,那麼您的程式ID就會發生變化.

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

ProcessName          Id
-----------          --
w3wp                 
5860

工作者處理和請求(Worker Processes and Requests)

    get-process cmdlet 不會找出當前工作者程式執行著那個應用程式池. 然而下面的方式可做到這一點:

PS IIS:\AppPools> dir DefaultAppPool\WorkerProcesses

 processId                  Handles                    state StartTime
 
---------                  -------                    ----- ---------
 
6612                       326                        1 3/28/2008 12:20:27 PM

當前正在執行的請求(Currently Executing Requests) 

      注:下面的內容我實在是看不明白,所以直接將E文帖在這裡,希望理解的朋友將內容發上來以便我及時更正。 

If your machine is not a production machine you will have a hard time looking at currently exeucting requests. The request is long gone until you make a request via Internet Explorer and get back into the PowerShell console. Here is a little helper; a request that takes a long time. 

 

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)


requestId    : d8000001800000f5
connectionId : d8000001600000f3
verb         : GET
url          : 
/long.aspx
siteId       : 
1

 

      如果您想檢視從執行請求開始到現在已過了多長時間的話:

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

url                                        timeElapsed
---                                        -----------
/long.aspx                                   2637

總結

      在本文中,您瞭解瞭如何檢視 IIS 應用程式池和站點的狀態. 如何啟動和關閉它們. 您也瞭解瞭如何檢視工作者

程式(worker processes)以及當前執行的請求.

 

     好了,今天的內容就到這裡。

 

     原文連結:http://www.cnblogs.com/daizhj/archive/2008/12/11/1352718.html

     作者: daizhj, 代震軍

     Tags: powershell,iis

     網址: http://daizhj.cnblogs.com/

相關文章