2008-10-07 10 views
150

Windows 서비스로 구현 된 '워치 독 (watchdog)'과 통신하는 C# (2.0 임베디드 XP에서 실행되는 응용 프로그램)이 있습니다. 장치가 부팅되면 일반적으로이 서비스를 시작하는 데 약간의 시간이 걸립니다. 내 코드에서 서비스가 실행 중인지 확인하고 싶습니다. 이것을 어떻게 할 수 있습니까?Windows 서비스가 실행 중인지 확인하는 방법

답변

290

는이 같은 일이 일 것 같아요

프로젝트 참조 (그것은 .NET 탭에서의)에 System.ServiceProcess를 추가합니다.

빠른 방법 :

return new ServiceController(SERVICE_NAME).Status == ServiceControllerStatus.Running; 

안전한 방법 :

try 
{ 
    using(ServiceController sc = new ServiceController(SERVICE_NAME)) 
    { 
     return sc.Status == ServiceControllerStatus.Running; 
    } 
} 
catch(ArgumentException) { return false; } 
catch(Win32Exception) { return false; } 

용장 방법 :

using System.ServiceProcess; 

// 

ServiceController sc; 
try 
{ 
    sc = new ServiceController(SERVICE_NAME); 
} 
catch(ArgumentException) 
{ 
    return "Invalid service name."; // Note that just because a name is valid does not mean the service exists. 
} 

using(sc) 
{ 
    ServiceControllerStatus status; 
    try 
    { 
     sc.Refresh(); // calling sc.Refresh() is unnecessary on the first use of `Status` but if you keep the ServiceController in-memory then be sure to call this if you're using it periodically. 
     status = sc.Status; 
    } 
    catch(Win32Exception ex) 
    { 
     // A Win32Exception will be raised if the service-name does not exist or the running process has insufficient permissions to query service status. 
     // See Win32 QueryServiceStatus()'s documentation. 
     return "Error: " + ex.Message; 
    } 

    switch(status) 
    { 
     case ServiceControllerStatus.Running: 
      return "Running"; 
     case ServiceControllerStatus.Stopped: 
      return "Stopped"; 
     case ServiceControllerStatus.Paused: 
      return "Paused"; 
     case ServiceControllerStatus.StopPending: 
      return "Stopping"; 
     case ServiceControllerStatus.StartPending: 
      return "Starting"; 
     default: 
      return "Status Changing"; 
    } 
} 

편집 : 원하는 상태를 취하는 방법 sc.WaitforStatus()도 있습니다 타임 아웃은 사용하지 않았지만 사용자의 요구에 맞을 수 있습니다.

편집 : 상태를 얻으면 상태를 다시 얻기 위해 sc.Refresh()으로 먼저 전화해야합니다.

참조 : .NET의 ServiceController 개체.

+9

ServiceController.GetServices()는 설치된 모든 서비스를 ServiceController 객체로 포함하는 배열을 검색합니다. 이것은 많은 도움이 될 수 있습니다. – Larry

+0

전화를 걸었 으면, 나는 그걸 사용했는지 모르겠다. 비록 당신이 그것을 결코 사용하지 않는다면, 나는 다른 것들이 – Carl

+8

sc.WaitforStatus()가 내가 필요로하는 것이면 디버깅하는데 유용 할 것이라고 생각한다. Thx – edosoft

18

.NET의 ServiceController 개체를 살펴보십시오.

+2

Oooh ... WMI를 통해 직접 롤링하는 것보다 낫습니다. 나는 내 대답을 제거 할 것이다. – EBGreen

+3

@EBGreen - WMI 경로가 앞으로 다른 사람에게 유용 할 수 있습니다. 고양이를 스킨하는 방법은 여러 가지가 있습니다. 모두 ... – Carl

+1

예,하지만 저는 ServiceController가 더 좋다고 생각합니다. 무엇보다도, 나는 그것을 삭제 된 채로 남겨 둘 것이라고 생각한다. 내가 깨우지 않았다면 결코 WMI를 제안하지 않았을 것입니다. :) – EBGreen

9

여기에서 사용 가능한 모든 서비스와 해당 상태를 로컬 컴퓨터에서 가져옵니다.

ServiceController[] services = ServiceController.GetServices(); 
foreach(ServiceController service in services) 
{ 
    Console.WriteLine(service.ServiceName+"=="+ service.Status); 
} 

루프를 service.name 속성과 비교하면 서비스 상태를 알 수 있습니다. 자세한 내용은 http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx http://msdn.microsoft.com/en-us/library/microsoft.windows.design.servicemanager(v=vs.90).aspx

관련 문제