반응형

Tool 개발 로그 - 1-1 #Jenkins #서비스 #재시작 + @작업하는 #Tool 만들기 c# -배경 #시나리오

 

Tool 개발 로그 - 1-1 #Jenkins #서비스 #재시작 + @작업하는 #Tool 만들기 c# -배경 #시나리오

* 2020년 9월에 작성 된 Tool의 개발 로그입니다. 회사에서 사용하고 있는 Jenkins 가 간혹 이상 증상을 일으키는데, 그 중 하나는 Windows OS 를 사용하는 Slave-node 들이 모두 off-line 으로 변경 된다. - 참

yobine.tistory.com

* 2020년 9월에 작성 된 Tool의 개발 로그, 2번째 프로그램 작성 ServiceControlCore 설명이다. 

- Windows OS 내 Services (서비스) 툴에 등록 된 서비스 를 멈추고 시작하고, 상태를 확인할 때, 유용하게 사용할 수 있도록 제공 된 닷넷 클래스가 있다. 이름은 ServiceController 이며 이에 대한 상세 설명은 다음 링크에 기록되어 있다. -  https://learn.microsoft.com/ko-kr/dotnet/api/system.serviceprocess.servicecontroller?view=dotnet-plat-ext-7.0

 

ServiceController 클래스 (System.ServiceProcess)

Windows 서비스를 나타내며 이 클래스를 사용하면 실행 중이거나 중지된 서비스에 연결하거나 서비스를 조작하거나 서비스 관련 정보를 가져올 수 있습니다.

learn.microsoft.com

이 클래스를 사용하여 서비스 상태를 가지고 오고, 멈춘 뒤, 필요한 작업을 진행 하고, 마지막에 서비스를 다시 시작한다. 해당 프로그램의 배경 시나리오 포스트( https://yobine.tistory.com/582 ) 에서 작성 된 프로그램의 전체 플로우와 동일하다. 

Main

이번 포스팅에서는 ServiceControlCore 클래스 내 있는 Method 들을 살펴 본다. 상단에 언급했듯 이 ServiceControlCore 클래스 에서는 닷넷에서 제공하는 ServiceController 클래스를 사용하여 Jenkins 서비스의 상태를 확인하고 변경한다.

프로그램에서 제일 처음에 호출 하는 작업이 GetServices() 메소드 이다. 

이 메소드는 Jenkins 서비스 상태를 확인하는 부분인데, 리턴 값은 bool 이며. 선언된 serviceName (Jenkins) 과 Services[] 로 받아온 리스트를 비교 하여, ServiceName 이 리스트에 있는지 우선 확인 하며, 서비스 이름이 Services 에 등록되어 있다면 현재 상태를 확인 하고, running 인 경우 true 를 반환한다. 

services 에 등록된 service 리스트
Services 리스트에서 검색 매치된 Jenkins
- GetService() 메소드 - 뭔가 많아 보이지만, result = true 로 바뀌는 부분만 중요하며, 나머지는 로그 관련 스트링 전달문들이다.

- 서비스가 언제나 running 인 상태여야 프로그램이 돌기 때문에, 이부분에 대해 수정이 필요할 것 같다. 

더보기

* 서비스 이름은 검색이 안되는 경우를 빼고는 해당 서비스의 상태가 stopped 인 경우에도 프로그램이 돌아야 한다. 이부분은 수정 되어야 할 사항이다. 아마 수정이 된다면, 다음 표의 내용 처럼 리턴 값을 받아 간단하게 수정이 될 수 있을 것 같다.

서비스 등록여부 서비스 상태 리턴 값
true (등록) running 11 : (true 1, running 1)
true (등록) stopped 10 : (true 1, stopped 0)
false (등록안됨) stopped 20 : (false 2, stopped 0)

 

다음은 ControlService() 메소드 다. 이 메소드에서 서비스를 실질적으로 멈추고, 시작한다. 우선 int flag 를 인자로 , 0은 서비스 멈춤 (Stop), 1은 서비스 시작 (Start) 으로 약속된 값을 전달 받는다. 실행 중인 Jenkins 서비스(serviceName )를 멈추고(Stop)  20초 timeout 시간을 걸어주는데, 서비스가 멈추는데 걸리는 시간이 대략 최대 20초 정도여서, 멈출 때까지 대기를 하지만, 대부분 20초 전에 멈추기 때문에 대기 시간으로써는 충분한 시간이다.

ControlService() Method

ControlService() 메소드 에서 flag 값에 따라 분기가 일어나는데, if/else 가 아닌 switch 문을 사용했다. 1과 0 만이 아닌 그외의 명령어 까지 전달을 생각으로 메소드를 작성했다. 내부적으로 시작 혹은 멈추는 명령어를 전달 후, 서비스 상태를 2초마다 확인하는데, 이 메소드 이름은 CheckServiceStatus(int flag) 이다. 이 메소드 는 ControlService(int flag) 메소드에서 전달 받은 동일한 인자 flag 를 받아 GetService() 메소드를 호출하여 상태를 확인 한다. 

CheckServiceStatus()

서비스를 Stop (0) 을 시켜야 하는데, GetService 의 리턴 값이 true 면, 다시 동일한 flag 값 (0) 을 가지고 재귀호출을 한다. 만약 GetSerivce 의 리턴값이 false 라면, break 가 걸리고, 서비스가 멈추었다는 로그를 남긴다. 

서비스를 Start(1) 하는 내용도 동일하다. 리턴값들이 반대이지만, 동일하게 작동한다. 

CMD 화면

해당 프로그램을 실행하면 위의 CMD 화면과 같이 화면에 로그들이 찍힌다. 처음에 Jenkins 서비스를 찾았고, 실행 중인 것이 확인 되어 재시작 프로세스가 시작되었다고 나오며, 서비스를 멈추게 한다. 서비스가 멈춘 후 삭제해야 할 폴더들을 각각 찾아서 삭제를 진행 하게 되며, 작업이 끝난 후에 다시 Jenkins 서비스를 실행 한다. 

-끝-

youp-han/Jenkins-Restart: it restarts the running Jenkins Service locally (github.com)

 

GitHub - youp-han/Jenkins-Restart: it restarts the running Jenkins Service locally

it restarts the running Jenkins Service locally. Contribute to youp-han/Jenkins-Restart development by creating an account on GitHub.

github.com

 

반응형

+ Recent posts