IT STORYs

특정 프로세서의 메모리 사용량 모니터해보기 (WMI이용하기) [출처] 특정 프로세서의 메모리 사용량 모니터해보기 (WMI이용하기)|작성자 토이 본문

Windows Server

특정 프로세서의 메모리 사용량 모니터해보기 (WMI이용하기) [출처] 특정 프로세서의 메모리 사용량 모니터해보기 (WMI이용하기)|작성자 토이

295~ 2008. 3. 10. 09:50

오늘은 WMI와 NotifyIcon을 이용하여 특정 프로세서의 메모리 사용랑 모니터 해보기로

하겠습니다.

제가 근무하는 곳에서 특정 데몬 프로세서가 있는데 이 친구가 가끔 특정치의 메모리 사용을

하게 되면 가끔 오작동을 해버립니다. 그래서 그 특정치가 되는 순간을 모니터링을 하기 위해

위와 같은 프로그램을 만들어 보았습니다.

1. 부터 메모리 사용량을 가져오는 메서드를 만들어보겠습니다.

WMI를 이용하였고 아시겠지만 System.Management를 using해줘야 합니다.

public string GetIcMessengerWorkingSet()
  {
   ConnectionOptions co = new ConnectionOptions();
   co.Username="계정";
   co.Password= "패스워드";
   System.Management.ManagementScope ms =
    new System.Management.ManagementScope(@"\\172.30.15.215\root\cimv2", co);
   string strResult = string.Empty;
   ManagementPath path = new ManagementPath( "Win32_Process");

   //Get the object on which the method will be invoked
   ManagementClass processMangement = new ManagementClass(ms,path,null);
   ManagementObjectCollection col = processMangement.GetInstances();

   string strCaption ="";
   bool chkZero = false;
   foreach(ManagementObject mo in col)
   {    
    strCaption = (string)mo["Caption"];
    if(strCaption=="icMessengerSrv.")
    {
     uint res01 = (uint)mo["PeakWorkingSetSize"];
     UInt64 res02 = (UInt64)mo["WorkingSetSize"];
     UInt64 temp = res02/1024;
     UInt64 temp1 = res02/1024/1024;

     chkZero = true;
     strResult = temp1.ToString();
    }
   }
   if(!chkZero)
   {
    strResult = "--";
   }

   processMangement.Dispose();
   col.Dispose();
   return strResult;
  }

저 같은 경우 172.30.15.215에 해당 하는 컴퓨터의 프로세서중에서 icMessengerSrv.로 실행되는 놈의 메모리 사용량을 알아 보도록 하겠습니다.

WMI를 콜하기위해서는 관리자 정도의 계정이 필요하니 유의 하세요.

위와 같이 폼 디자인 해주고 로드이벤트시

아래와 같이 코드를 작성합니다

private void Form1_Load(object sender, System.EventArgs e)
  {
   string temp = "icMessengerWorkingSet : \r\n"+ GetIcMessengerWorkingSet()+"MB";
   notifyIconStatus.Text = temp;
   notifyIconStatus.Visible= true;
   notifyIconStatus.ContextMenu = contextMenu1;
   this.Visible = false;
   this.ShowInTaskbar = false;
   timer1.Start();
  }

참고로 timer의 인터발은 120000 (2분)으로 주었습니다.

contextMenu1에서 하나의 메뉴를 만들로 "종료"라고 이름을 넣습니다.

그 종료 메뉴를 넣고 더블클릭을 하면 이벤트 헨들러를 작성해야하는데 아래와 같이 작성합니다.

private void menuItem1_Click(object sender, System.EventArgs e)
  {
   DialogResult dr = MessageBox.Show("종료하시겠습니까?","물음",
           MessageBoxButtons.YesNo,
           MessageBoxIcon.Question);
   if(dr == DialogResult.Yes)
   {
    bExit = true;
    this.Close();
   }
  }

그리고 폼의 종료시점에서 종료할지 notification Icon을 작동할지를 판단해야 하므로 closing이벤트 헨들러를 아래와 같이 작성합니다.

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
  {
   if(!bExit)
   {
    timer1.Stop();
    e.Cancel = true;
    this.Visible = false;
    notifyIconStatus.Visible = true;
   }
   else
   {
    notifyIconStatus.Visible = false;
   }
  }

그리고 timer의 tick이벤트를 작성합니다.

private void timer1_Tick(object sender, System.EventArgs e)
  {
   string temp = "icMessengerWorkingSet : \r\n"+ GetIcMessengerWorkingSet()+"MB";
   notifyIconStatus.Text = temp;   
  }

그럼 거의 모든것이 완성 되었네요..

이런 코드를 작성하면 어떻게 동작할까요?

결과는 아래와 같습니다.

심슨의 아이콘에서 메모리 사용량이 나타는것이 보이시죠?

본인이 그 시스템의 관리자라면 wmi를 이용하여 컴퓨터를 감시하는 프로그램을 만드는것도

괜찮은것 같습니다.

코드는 그렇게 어렵지 않아서 설명은 생략합니다. 모르시겠으면 질문해주세요..

그럼 이만..

[출처] 특정 프로세서의 메모리 사용량 모니터해보기 (WMI이용하기)|작성자 토이

Comments