ワーカープロセスを列挙する方法

マネージド コード API を使って、現在実行中のワーカープロセスを列挙する方法を示します。

Microsoft.Web.Administration 名前空間の、ServerManager から WorkerProcesses コレクションを取得することができ、これらの要素である WorkerProcess から情報を取得できます。

尚、以下のサンプルではプロセス ID が取れたついでに、System.Diagnostics.Process オブジェクトも取得して、その結果を少し表示しています。

コードサンプル

ソースコード

EnumWP.cs として以下を保存します。

//
// EnumWP.cs
//
// Author: Dado-san
// http://keicode.com/
//


using System;
using System.Diagnostics;
using Microsoft.Web.Administration;


//////////////////////////////////////////////////////////////////////////


class EnumWorkerProcessApp {

     public static void Main() {

          EnumWorkerProcess();

     }

          
     public static void EnumWorkerProcess() {
                 
          ServerManager manager = new ServerManager();
                 
          if ( manager.WorkerProcesses.Count == 0     ) {
               Console.WriteLine ( "No worker process running." );
               return;       
          }
                 
                 
          foreach ( WorkerProcess wp in manager.WorkerProcesses ) {
                 
               Console.WriteLine ( "AppPoolName: {0}", wp.AppPoolName );
               Console.WriteLine ( "ProcessId:   {0}", wp.ProcessId );
               Console.WriteLine ( "ProcessGuid: {0}", wp.ProcessGuid );
               Console.WriteLine ( "State:       {0}", wp.State );

               foreach ( ApplicationDomain ad in wp.ApplicationDomains ) {

                    Console.WriteLine ( "ApplicationDomain: {0}", ad.VirtualPath );
                    Console.WriteLine ( " PhysicalPath: {0}", ad.PhysicalPath );
                    Console.WriteLine ( " Idle:         {0}", ad.Idle );
                    Console.WriteLine ( " Id:           {0}", ad.Id );
                    
               }

               // System.Diagnostics.*

               Process p = Process.GetProcessById ( wp.ProcessId );
               ShowProcessInfo( p );

               
          }

     }


     public static void ShowProcessInfo ( Process p ) {

          Console.WriteLine ( "BasePriority:    {0}", p.BasePriority );
          Console.WriteLine ( "HandleCount:     {0}", p.HandleCount );
          Console.WriteLine ( "MachineName:     {0}", p.MachineName );
          Console.WriteLine ( "MainModule:      {0}", p.MainModule );
          Console.WriteLine ( "MainWindowTitle: {0}", p.MainWindowTitle );
          Console.WriteLine ( "MaxWorkingSet:   {0}", p.MaxWorkingSet );

     }
     
}

makefile は次のようになります。

CSC = csc.exe
TARGETNAME=enumwp
SOURCE_FILE=enumwp.cs
REF=/r:$(SYSTEMROOT)\System32\inetsrv\Microsoft.Web.Administration.dll
OUTDIR=.\chk

all: "$(OUTDIR)\$(TARGETNAME).exe"


"$(OUTDIR)" :
    @if not exist "$(OUTDIR)" mkdir "$(OUTDIR)"


CSC_OPT=\
	/nologo\
	/target:exe\
	/out:$(OUTDIR)\$(TARGETNAME).exe\
	/doc:$(OUTDIR)\$(TARGETNAME).xml\
	/debug+\
	/debug:full\
	/optimize-\
	/warn:4


$(OUTDIR)\$(TARGETNAME).exe: "$(OUTDIR)" $(SOURCE_FILE)
	$(CSC) $(CSC_OPT) $(REF) $(SOURCE_FILE)


ビルド

上記を nmake でビルドしてください。chk サブディレクトリの中に enumwp.exe が出来上がります。

実行例

上で作成した enumwp.exe を実行すると以下の結果を得ました。

> enumwp
AppPoolName: DefaultAppPool
ProcessId:   3808
ProcessGuid: 9464250e-2b06-476a-999b-a4ca79e1d65d
State:       Running
ApplicationDomain: /vdir/
 PhysicalPath: C:\temp\
 Idle:         1
 Id:           /LM/W3SVC/1/ROOT/vdir
BasePriority:    8
HandleCount:     402
MachineName:     .
MainModule:      System.Diagnostics.ProcessModule (w3wp.exe)
MainWindowTitle:
MaxWorkingSet:   1413120

>

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説