Freigeben über


PowerShell-Snap-In: Laufzeitdaten

von Thomas Deml

In den vorherigen exemplarischen Vorgehensweisen wurde gezeigt, wie Sie IIS-Konfigurationseinstellungen abfragen und ändern. Es gibt jedoch einen nicht erkundeten Bereich: Laufzeitdaten.

Einführung

Die Dinge ändern sich, IIS ist da keine Ausnahme. Sites werden gestartet oder gestoppt, Anwendungspools werden recycelt oder erleben ein Timeout, Anfragen gehen ein und Antworten werden gesendet, AppDomains werden erstellt oder geschlossen. IIS implementiert eine Schnittstelle namens RSCA (Run-time State and Control API, Laufzeitstatus- und Steuerelement-API), mit der Sie überwachen können, was im System passiert.

Das IIS PowerShell-Snap-In verwendet diese Schnittstelle und macht einige seiner Daten über den IIS-Snap-In-Namespace verfügbar. Der Status von Websites und Anwendungspools kann über die Cmdlets „Get-WebItemState“, „Start-WebItem“, „Stop-WebItem“ und „Restart-WebItem“ konfiguriert werden. Laufzeitstatus wie derzeit ausgeführte Arbeitsprozesse, derzeit ausgeführte Anforderungen und geladene AppDomains werden über den IIS-Namespace verfügbar gemacht.

In dieser exemplarischen Vorgehensweise werden die Websites, Anwendungen und virtuellen Verzeichnisse verwendet, die in einer vorherigen exemplarischen Vorgehensweise erstellt wurden.

Website- und Anwendungspoolstatus

Wir beginnen mit der Abfrage des Status unserer Websites.

Websitestatus

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

Das Beenden von DemoSite kann mit dem Cmdlet „Stop-WebItem“ erreicht werden:

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

Der Beginn funktioniert natürlich gleich:

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

AppPool-Status

Wir möchten dasselbe für Anwendungspools tun.

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

Es gibt aber auch die Statuseigenschaft, die Sie im AppPools-Knoten lesen können. Nehmen wir das nächste Beispiel als Anregung. Schalten Sie die Lautsprecher ein, und führen Sie den folgenden Befehl aus:

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);}

Starten Sie DemoAppPool jetzt erneut:

PS IIS:\AppPools> Start-WebItem DemoAppPool

AppPools wiederverwenden

Der einzige Unterschied bei AppPools besteht darin, dass sie wiederverwendet werden können. Das Cmdlet zum Recyceln von AppPools lautet „Restart-WebItem“ und nicht „Recycle-WebItem“. PowerShell verfügt über ziemlich strenge Benennungsregeln, und wir mussten uns für „Restart-WebItem“ entscheiden. Erweitern wir dieses Beispiel etwas, indem wir

  1. eine Anforderung an die Standardseite der ‚Standardwebsite‘ stellen.
  2. die PID des Arbeitsprozesses abfragen, der die Anfrage bearbeitet.
  3. den Anwendungspool wiederverwenden.
  4. die PID erneut anfordern, um zu bestätigen, dass der Prozess neu gestartet wurde.

1. Anfordern der Standardseite

Wir verwenden die Net.WebClient-Klasse zum Anfordern von http://localhost/. Anstatt die Ausgabe auf dem Bildschirm anzuzeigen, betrachten wir nur die Länge der Antwort.

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

2. Abfragen der Arbeitsprozess-PID

Wenn Sie keine anderen aktiven Websites und Anwendungen auf Ihrem Computer haben, sollte der folgende Befehl nur eine PID zurückgeben:

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

Es gibt eine bessere Möglichkeit, um zu Arbeitsprozessen zu gelangen, die etwas später in dieser Anleitung behandelt wird.

3. Wiederverwenden des Anwendungspools

Wir recyceln den Anwendungspool mithilfe des Cmdlets „Restart-WebItem“:

PS IIS:\AppPools> Restart-WebItem DefaultAppPool

4. Abfragen der Arbeitsprozess-PID

Wenn der AppPool erfolgreich wiederverwendet wurde, sollte Ihre Prozess-ID geändert worden sein.

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

Arbeitsprozesse und Anforderungen

Das Cmdlet „get-process“ hilft Ihnen nicht, herauszufinden, welchen Anwendungspool ein bestimmter Arbeitsprozess bedient. Das können jedoch ganz einfach herausfinden:

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

Anforderungen werden aktuell ausgeführt

Wenn es sich bei Ihrem Computer nicht um einen Produktionscomputer handelt, können Sie sich die derzeit ausgeführten Anforderungen schwer ansehen. Die Anforderung ist längst verschwunden, bis Sie eine Anforderung über Internet Explorer stellen und wieder in die PowerShell-Konsole gelangen. Hier ist ein kleiner Helfer; eine Anforderung, die lange dauert.

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

Wenn Sie sich die aktuell ausgeführten Anforderungen ansehen möchten, können Sie den folgenden Befehl eingeben (HINWEIS: Die Prozess-ID, die Sie für den Befehl „get-item“ verwenden müssen, weicht auf Ihrem Computer ab):

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

Oder wenn Sie sehen möchten, wie viel Zeit seit dem Starten der Anforderung bereits vergangen ist:

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

Zusammenfassung

Fertig. In dieser exemplarischen Vorgehensweise haben Sie erfahren, wie Sie den Status von IIS-Anwendungspools und -Websites abfragen. Sie haben herausgefunden, wie Sie sie starten und beenden. Außerdem haben Sie gelernt, wie Sie Arbeitsprozesse und derzeit ausgeführte Anforderungen betrachten.