본문 바로가기

프로그래밍&IT/C#

[C#] ServiceController 클래스 관련해서

ServiceController

네임 스페이스 : System.ServiceProcess (System.ServiceProcess.dll 임포트해야)


개인적으로 만드는 프로그램 중, 필수적인 서비스 (Database 등)가 실행중인지 아닌지 확인할때까 있습니다.

이럴때 해당 서비스를 연결하거나 서비스 관련정보를 가져올때

ServiceController라는 클래스가 존재한다는 걸 알게되었습니다.


일단 msdn의 내용을 일부 가져왔습니다. (링크)


속성

 이름

내용 

 CanPauseAndContinue

 서비스를 일시 중지했다가 다시 시작할 수 있는지를 나타내는 값을 가져옵니다.

 CanShutdown

 시스템을 종료할 때 서비스에 알릴지를 나타내는 값을 가져옵니다.

 CanStop

 시작한 서비스를 중지할 수 있는지의 여부를 나타내는 값을 가져옵니다.

 DependentServices

 이 연결 된 서비스에 종속 된 서비스의 집합을 가져옵니다 ServiceController 인스턴스.

 MachineName

 이 서비스가 상주하는 컴퓨터의 이름을 가져오거나 설정합니다.

 ServiceName

 이 인스턴스가 참조하는 서비스를 식별하는 이름을 가져오거나 설정합니다.

 Status

 이 인스턴스에서 참조하는 서비스 상태를 가져옵니다.

등 등


메소드

 이름

내용 

 Close()

 연결을 끊고 ServiceController 서비스에서 인스턴스를 해당 인스턴스가 할당 하는 모든 리소스를 해제 합니다.

 Continue()

 일시 중지한 서비스를 계속합니다.

 GetServices()

 로컬 컴퓨터에서 장치 드라이버 서비스를 제외한 모든 서비스를 검색합니다.

 Pause()

 서비스 작업을 일시 중단합니다.

 Start()

 인수를 전달하지 않고 서비스를 시작합니다.

 Start(String[])

 지정된 인수를 전달하면서 서비스를 시작합니다.

 Stop()

 이 서비스와 이 서비스에 종속되는 서비스를 중지합니다.

등 등


저는 개인적으로 database 인스턴스가 살아있는지의 확인용으로 썼습니다.

근데 이상하게 Service Start를 못하는것도 존재하던데 그 이유를 잘 모르겠네요...


ex) 해당 Service가 살아있는지 확인하는 내용. (namespace는 제외했습니다


static void Main(string[] args) {

string svcNm = "MSSQLSERVER"; // 확인할 서비스명


        // 해당서비스가 살아있는지 아닌지 확인하는 메소드

if(IsRunningMSSQL(svcNm)) {

Console.WriteLine("Service Alive.");

   } else {

      Console.WriteLine("Service Dead.");

         }

Console.ReadLine();

}


static bool IsRunningMSSQL(string svcNm) {

bool ret = true;

ServiceController sc = new ServiceController(svcNm);


  //해당 서비스의 일부 속성 출력

Console.WriteLine("Can Pause & Continue: "+ sc.CanPauseAndContinue);

Console.WriteLine("Can Shutdown: "+sc.CanShutdown);

Console.WriteLine("Can Stop="+sc.CanStop);


  //해당 서비스가 살아있는가

if (sc.Status != ServiceControllerStatus.Running) {    // 서비스 상태관련된 Status값으로 실행중 여부 확인

if(sc.Status == ServiceControllerStatus.Stopped) {

try {

sc.Start(); //제가 많이 몰라서그런데, 시작못하는 서비스의 경우있어서, try~catch로 묶어놨습니다.

} catch {

Console.WriteLine("서비스 {0} Start에 실패함", sc.ServiceName);

}

}

Thread.Sleep(2000); //필요는없지만 간혹 시작시 시간이 걸리는 서비스가 있을듯해서


if(sc.Status == ServiceControllerStatus.Running) {

ret=true;

} else {

ret=false;

}

}

return ret;


결과값



부족하지만, 필요한 부분만 적어놨습니다.