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

発行日 : 2008 年 4 月 14 日 (作業者 : thomad(英語))
更新日 : 2009 年 3 月 9 日 (作業者 : thomad(英語))

前述のチュートリアルでは、IIS 構成設定をクエリして変更する方法について説明しました。

はじめに

すべての物事は変化します。IIS も例外ではありません。サイトが開始されたり、停止されたりします。アプリケーション プールがリサイクルされたり、タイムアウトしたりします。要求が到着し、応答が送信されます。アプリケーション ドメインが新たに開始されたり、シャット ダウンされたりします。IIS7 では、システム内で何が起きているかを監視できる、RSCA (Runtime State and Control API : 実行時の状態と制御 API) というインターフェイスを実装しました。

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

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

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

最初に Web サイトの状態についてクエリを実行します。

サイトの状態

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

Stop-WebItem コマンドレットを使用して、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

アプリケーション プールの状態

アプリケーション プールについても同じことを実行できます。

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 ノードには、読み取り可能な state プロパティも存在します。次の例はおもしろいですよ。スピーカーの電源をオンにして、次のコマンドを実行してください。

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

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

アプリケーション プールが他のオブジェクトと異なる点として、リサイクル可能であることが挙げられます。アプリケーション プールをリサイクルするコマンドレットは Restart-WebItem であり、Recycle-WebItem ではありません。PowerShell では厳格な命名規則を採用しており、Restart-WebItem とせざるを得ませんでした。ここでは、アプリケーション プールを題材に少し拡張した例を実行していきます。

  1. "Default Web Site" の既定のページに対して要求を実行します。
  2. クエリを実行して、要求を処理するワーカー プロセスの PID を取得します。
  3. アプリケーション プールをリサイクルします。
  4. プロセスが再起動されたことを確認するため、PID を再度要求します。

1. 既定のページの要求

Net.WebClient クラスを使用して https://localhost/ を要求します。画面に出力を表示するのではなく、応答の長さを調べます。

 PS IIS:\AppPools> $response = (new-object Net.WebClient).DownloadString("https://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 のクエリ実行

アプリケーション プールが正常にリサイクルされた場合、プロセス 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 アプリケーション プールとサイトの状態に関するクエリを実行する方法について説明しました。また、アプリケーション プールとサイトを開始および停止する方法を紹介しました。さらに、ワーカー プロセスおよび現在実行中の要求を参照する方法についても学びました。