Windows 서비스가 실행 중인지 확인하는 방법


182

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


1
.NET 의 ServiceController 객체를 살펴보십시오 .
Larry

WMI를 통해 자신을 굴리는 것보다 낫습니다. 답변을 삭제하겠습니다.
EBGreen

@EBGreen - 난 모르겠 WMI 경로는 미래에 다른 사람이 유용 할 수있다 피부에 하나 이상의 방법 고양이, 그리고 모든 것을 ...

그러나 ServiceController가 모든 것보다 낫다고 생각하므로 삭제 된 채로 두겠습니다. 방금 깨어나지 않았다면 WMI를 제안한 적이 없었을 것입니다. :)
EBGreen

답변:


366

나는 이와 같은 것이 효과가 있다고 생각한다.

System.ServiceProcess프로젝트 참조에 추가 하십시오 (.NET 탭에 있음).

using System.ServiceProcess;

ServiceController sc = new ServiceController(SERVICENAME);

switch (sc.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 객체.


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

9
System.ServiceProcess에 대한 참조를 추가하고 명령문을 추가하십시오. using System.ServiceProcess;
NealWalters 2009

6
잘못된 서비스 이름을 전달하면 오류가 발생하지 않고 잠기는 것처럼 보입니다. 이 코드를 추가했습니다 : catch (System.Exception ex) {return "Not found"; }
NealWalters 2009

6
NealWalters : 서비스를 찾지 못해 예외가 발생했다는 것을 어떻게 알 수 있습니까? 더 적합한 예외 유형이 없는가?
Patrik Svensson

3
private static bool ServiceExists (string serviceName) {return ServiceController.GetServices (). FirstOrDefault (s => s.ServiceName == serviceName)! = null; }
Dmitry Pavlov

16

여기에서는 로컬 컴퓨터에서 사용 가능한 모든 서비스와 상태를 얻을 수 있습니다.

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.aspxhttp://msdn.microsoft.com/en-us/library/microsoft.windows.design .servicemanager (v = vs.90) .aspx

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.