PowerShell スナップイン: 実行時データ

作成者: Thomas Deml

前のチュートリアルでは、IIS 構成設定のクエリと変更を行う方法について説明しました。 ただし、未踏の領域が 1 つあります。ランタイム データです。

はじめに

状況は変わりますが、IIS も変わりません。 サイトの開始または停止、アプリケーション プールのリサイクルまたはタイムアウト、要求の受信または応答の送信、AppDomains の生成またはシャットダウンが行われます。 IIS は RSCA (ランタイム状態と制御 API) と呼ばれるインターフェイスを実装します。これにより、システムで何が起こっているかを監視できます。

IIS PowerShell スナップインはこのインターフェイスを使用し、IIS スナップイン名前空間を介してそのデータの一部を公開します。 サイトとアプリケーション プールの状態は、Get-WebItemState、Start-WebItem、Stop-WebItem、および Restart-WebItem のコマンドレットを使用して構成できます。 現在実行中のワーカー プロセス、現在実行中の要求、読み込まれた AppDomain などの実行時の状態は、IIS 名前空間を介して公開されます。

このチュートリアルでは、前のチュートリアルで作成したサイト、アプリケーション、仮想ディレクトリを使用します。

サイトとアプリケーション プールの状態

まず、Web サイトの状態に対してクエリを実行します。

サイトの状態

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

DemoSite の停止するには、Stop-WebItem コマンドレットを使用します。

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

ただし、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

AppPools のリサイクル

AppPools との違いの一つに、リサイクルできることが挙げられます。 AppPools をリサイクルするコマンドレットは、Recycle-WebItem ではなく Restart-WebItem と呼ばれます。 PowerShell には非常に厳密な名前付け規則があるため、Restart-WebItem にする必要がありました。 この例を少し展開してみましょう

  1. [既定の Web サイト] の既定のページに要求を行います。
  2. ワーカー プロセスの 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 に対するクエリ

コンピューターに他のアクティブな Web サイトとアプリケーションがないと仮定すると、次のコマンドは PID を 1 つだけ返すはずです。

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

このチュートリアルではもう少し後で紹介しますが、ワーカープロセスにアクセスするより良い方法があります。

3.アプリケーション プールのリサイクル

Restart-WebItem コマンドレットを使用して、アプリケーション プールをリサイクルします。

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 コマンドレットは、特定のワーカー プロセスがどのアプリケーションプールにサービスを提供しているかを特定するのに役立ちません。 ただし、これは簡単にできます。

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 アプリケーション プールとサイトの状態についてクエリを実行する方法を説明しました。 また、これらの起動方法および停止方法についても学習しました。 あらに、ワーカー プロセスと現在実行中の要求を確認する方法についても学習しました。