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 にする必要がありました。 この例を少し展開してみましょう
- [既定の Web サイト] の既定のページに要求を行います。
- ワーカー プロセスの 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 に対するクエリ
コンピューターに他のアクティブな 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 アプリケーション プールとサイトの状態についてクエリを実行する方法を説明しました。 また、これらの起動方法および停止方法についても学習しました。 あらに、ワーカー プロセスと現在実行中の要求を確認する方法についても学習しました。