This post is a translation of the article specified below. 本投稿は IIS.NET の記事をブログオーナーが独自に翻訳したものです。参考情報としてご利用ください。
ウォークスルーの一覧は [独自翻訳] IIS 7.0 PowerShell プロバイダ を使ってみよう! をご覧ください。
/*原文*/
Querying and Changing Run-time Data (Web-Site State, Application Pool State, Currently Executing Requests) http://learn.iis.net/page.aspx/439/powershell-provider-run-time-data
/*翻訳*/
前のウォークスルーでは IIS の構成設定をクエリーあるいは変更する方法を学びました。さて、まだ未開のエリアがあります。実行時情報です。
一般的に物事・状態は時とともに変化します。IIS も同様です。サイトは起動・停止しますし、アプリケーションプールはリサイクル・タイムアウトします。また、リクエストが来てレスポンスが送られ、AppDomain も作成され、シャットダウンされます。IIS7 では RSCA (run-time state and control API) というインタフェースを内部で何が起きているかをモニターするために実装しました。
補足:IIS7の大きな特徴の一つがブラックボックス化の改善ともいえる RSCA と呼ばれるこの新 API です。これが何をするかというと実行しているその時点のスナップショットを公開する機能を持ったAPIで、今まで「IIS は中で何が起きているのか本当にわからない」というご意見・印象に対して一石を投じるものになります。つまり、ある時点で各実行プロセス(ワーカープロセス)内で何が起きているのか、ワークプロセスが今 どの状態にあるのかをプログラム的にアクセス可能なのです。標準で付属のツールでもこの API を生かした機能がついています。IIS マネージャ、appcmd.exe、WMI、MWA(.NETおクラス)それぞれで実行時情報をアクセスできるようになっています。ここでは Windows PowerShell で同様にこの API を生かそうということです。
IIS 7.0 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
アプリケーションプールでも同じことをしてみましょう。
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. デフォルトページをリクエストする
Net.WebClient クラスを使って http://localhost/ をリクエストします。HTML出力を完全に画面に表示するのではなく、レスポンスの長さだけ表示します。
PS IIS:\AppPools> $response = (new-object Net.WebClient).DownloadString("http://localhost/") PS IIS:\AppPools> $response.Length 689
2. ワーカープロセスの PID をクエリーする
あなたのマシンでほかにアクティブな Web サイトやアプリケーションが無い前提を置くと、以下のコマンドは一つのPIDを返すはずです。
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 は変わっているはずです。
ProcessName Id ----------- -- w3wp 5860
get-process コマンドレットではどのアプリケーションプールがどのプロセスで実行されているかを判断するのに使うことはできません。ただ、これは下記の要領で簡単に実行できます。
PS IIS:\AppPools> dir DefaultAppPool\WorkerProcesses
Process State Handles Start Time Id -------- ----- ------- ---------- 6612 Running 326 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 はあなたのマシンでは異なりますので dir で得た PID を使いましょう。)
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 アプリケーションプールやサイトの状態をクエリーし、開始 あるいは 停止する方法も学びました。また現在実行しているワーカープロセスやリクエストを参照する方法も学びました。
/* 翻訳 終わり*/