본문 바로가기
Python

[Python] Windows Service 만들기

by 아마도개발자 2023. 11. 19.

아마도 서버에서 여러 개의 배치 프로그램을 돌리고 있으면 다른 작업시에 매우 거슬릴 것이다. 서버에서 어떤 프로그램을 동작 시켜야할 때, 실시간으로 콘솔에서 로그를 확인해야 되는 경우가 아니라면 서비스를 만들어서 백그라운드에서 실행되는 것처럼 만드는 것이 훨씬 간편할 것 같다. 정기적인 서버점검 후 재부팅 되었을 때도, 자동으로 실행되도록 할 수 있는 서비스가 유리할 것이라고 생각한다. 

 

우선 Windows Service란 무엇일까?


윈도우 서비스(Windows service)는 오랜 시간 동안 실행되며 특정한 기능을 수행하는 실행 파일이며, 사용자 간섭을 요구하도록 설계되지 않았다. 윈도우 서비스는 보통 마이크로소프트 윈도우 운영 체제가 시동될 때 실행되며 윈도우가 실행되고 있는 한 백그라운드 모드에서 실행된다.

 

Windows Service의 장점은 로그인과 관계없이 실행된다는 것이다.

 

일반적인 프로그램의 경우는 시작프로그램에 등록되어 있다 하더라도 로그인이 되지않으면 실행되지 않는다.

반면, Windows Service는 컴퓨터 부팅시 자동으로 실행되기 때문에 사용자의 간섭없이 항시 작동해야 하는 프로그램일 경우에는 Windows Service가 훨씬 적합한 선택이라고 볼 수 있다.

 

 

 

그럼 파이썬으로 간단한 Windows Service를 만들고, 등록하는 방법을 알아보자.

 

우선 pip install pywin32 커맨드로 필요 모듈을 추가하고, 아래와 같이 서비스 클래스를 작성한다.

# WinService.py

import win32serviceutil
import time
from datetime import datetime



def logging(self):
    while self.isRunning:
        time.sleep(5)
        now = datetime.now()
        with open(f'C:/SHI/{now.year}_{now.month}_{now.day}_log.txt',mode="a+") as f:
            f.write(f'{now} | 로그확인' + '\n')

class ExampleService(win32serviceutil.ServiceFramework):
    _svc_name_ = "ExampleService"
    _svc_display_name_ = "My Example"
    isRunning = False

    def SvcStop(self):
        self.isRunning = False

    def SvcDoRun(self):
        self.isRunning = True
        logging(self)

if '__main__' == __name__:
    win32serviceutil.HandleCommandLine(ExampleService)

 

ExampleService 클래스의 _svc_name_은 실제 서비스명, _svc_display_name_은 서비스에 표기되는 명칭을 뜻한다.

SvcStop은 서비스가 중지 되었을 때, SvcDoRun은 서비스가 시작되었을 때 호출되는 함수이다.

 

나는 5초마다 현재 시간과 함께 로그확인이라는 로그를 남겨주는 logging이라는 함수를 만들었다.

위와 같이 원하는 프로그램을 만들었다면 이제 서비스에 등록을 할 차례이다.

 

- python {project name}.py install을 입력하면 손쉽게 서비스가 설치되는 것을 볼 수 있다.

 

Service installed를 확인 한뒤 windows 검색창에서 서비스를 실행하여 확인해보면,

 

 

이렇게 서비스가 정상적으로 등록된 것을 볼 수 있다.

 

등록된 서비스를 실행하는 방법은 간단하다.

1. 등록된 서비스 - 우 클릭 - 시작 

2. cmd창에서 python {project name}.py start 명령어 입력

 

두 가지 방법으로 실행시키면 된다. 실행시킨 뒤, 나의 경우 c:\shi 경로를 확인해보면

 

정상적으로 로그를 만들어내는 것을 볼 수 있다!

 

 

서비스 중지시에는 주의할 점이 있는데 프로그램 내 반복문의 종료조건이 반복문을 종료시키지 못한다면,  서비스 중지가 불가능한 상황이 오게 될 수도 있다. 

 

만약 그럴 경우 관리자 권한으로 CMD를 실행하여

 

 

1. sc.exe queryex ExampleServices => PID 확인

2. taskkill /pid {pid} /f => 프로세스 종료

3.sc delete {service} => 서비스 삭제

순으로 서비스를 중지시킨뒤, 삭제할 수 있다.

 

 

간단하게 파이썬으로 Windows Service를 만들었다. 사실 만드는 과정에서 살짝 헤매기는 했지만 c#보다는 훨씬 편하게 서비스를 만들 수 있었다. 아마도.

 

 

'Python' 카테고리의 다른 글

[Python] PyInstaller로 exe파일 만들기  (6) 2024.09.14