Cute Light Pink Flying Butterfly OS 상태 체크 | WMI를 이용한 실시간 프로세스 모니터링 :: 놀면서 돈벌기
본문 바로가기
IT/Architecture

OS 상태 체크 | WMI를 이용한 실시간 프로세스 모니터링

by esclife_ 2026. 1. 25.
반응형

 

 

WMI와 쿼리 기반 이벤트 모델: 프로세스 생명주기 상태 구독하기

 

WMI(Windows Management Instrumentation)란?

WMI는 WBEM(Web-Based Enterprise Management) 표준을 윈도우에 구현한 것으로, 운영체제의 모든 리소스(하드웨어, 소프트웨어, 프로세스 등)를 데이터베이스처럼 관리하고 조회할 수 있게 해주는 강력한 인프라입니다.

단순히 현재 상태를 조회(Polling)하는 것을 넘어, 특정 조건이 만족되었을 때 OS가 나에게 신호를 보내주는 이벤트 구독 모델을 지원합니다.

WMI의 핵심: WQL (WMI Query Language)

WMI를 제어할 때는 SQL과 매우 유사한 WQL을 사용합니다.

SELECT * FROM __InstanceDeletionEvent 
WITHIN 1 
WHERE TargetInstance ISA 'Win32_Process' 
AND TargetInstance.ProcessId = {PID}

 

  • __InstanceDeletionEvent: 객체가 '삭제'될 때 발생하는 시스템 클래스입니다. 프로세스 관점에서는 '종료'를 의미합니다.
  • WITHIN 1: 폴링 간격입니다. WMI 엔진이 1초마다 변경 사항을 체크하여 이벤트를 생성하도록 명령합니다.
  • ISA 'Win32_Process': 객체의 타입을 지정합니다. Win32_Process 클래스의 인스턴스인 경우에만 이벤트를 발생시킵니다.

 

 //  WMI 감시 시작
        private void StartProcessExitWatcher()
        {
            if (_processToWatch == null) return;
            string query = $"SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.ProcessId = {_processToWatch.Id}";
            _processEventWatcher = new ManagementEventWatcher(query);
            // '비상 연락처' 등록: 이벤트가 발생하면, OnProcessExited를 호출
            _processEventWatcher.EventArrived += OnProcessExited;
            _processEventWatcher.Start();
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine($"[ProcessManager] WMI watcher is now monitoring the client process (PID: {_processToWatch.Id}).");
            Console.ResetColor();
        }

        // WMI 이벤트 핸들러 EnableRelabelPrivilege
        private void OnProcessExited(object sender, EventArrivedEventArgs e)
        {
            if (_processEventWatcher == null) return;

            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("\n[프로세스 관리자] WMI 이벤트 전파 - 감시 중인 프로세스가 종료되었습니다!");
            Console.ResetColor();

            // 2. '구독자(Program.cs)'에게 이벤트 발생을 알림
            ProcessExited?.Invoke(this, EventArgs.Empty);

            // 3. 이벤트 처리가 끝났으므로, 감시자를 정리
            DisposeWatcher();
        }

 

이 방식은 비동기(Asynchronous)로 동작하므로 메인 스레드는 자신의 일을 계속 수행하면서 프로세스가 죽었을 때만 OS로부터 콜백(Callback)을 받을 수 있습니다.


WMI인가 vs 일반 Process.HasExited

일반적인 Process 객체의 Exited 이벤트는 해당 프로세스를 내가 직접 실행했을 때만 비교적 정확하게 동작합니다. 반면 WMI를 통한 감시는 다음과 같은 전문적인 장점이 있습니다.

  1. 디테일한 필터링: 프로세스 이름, PID, 실행 경로 등 복합적인 조건을 쿼리로 세밀하게 필터링할 수 있습니다.
  2. 시스템 전체 감시: 내가 띄우지 않은 제3의 프로세스가 실행되거나 죽는 것도 감시할 수 있습니다.
  3. 낮은 리소스 소모: 무한 루프를 돌며 상태를 체크하는 것이 아니라, OS가 관리하는 객체의 상태 변화를 구독하는 방식이므로 CPU 효율성이 높습니다.

시스템 개발자의 시선

WMI는 보안 샌드박스로 내보낸 프로세스의 생명줄을 관리하는 역할을 합니다. 클라이언트 프로세스가 종료되는 순간, WMI는 즉시 서버에 신호를 보내고 서버는 파이프 서버 정지와 자원 해제를 수행합니다. 즉, 상태를 구독해서 종료되거나 문제가 생겼을때 바로 알 수 있는것이죠. 따로 5초마다 확인하는 healthCheck, HeartBeatCheck를 따로 구현해서 딜레이를 가져갈 필요를 없애는 것입니다.

단순히 기능을 구현하는 것을 넘어, OS가 제공하는 표준 관리 인프라를 이해하고 활용하는 것은 백엔드 엔지니어에게 시스템 전체를 조망할 수 있는 넓은 시야를 제공합니다.

 

WMI는 강력하지만 과도한 WITHIN 간격 설정은 시스템 성능에 영향을 줄 수 있으므로, 비즈니스 요구사항에 맞는 적절한 인터벌 설정이 중요하답니다 !

반응형