이번 시간에는 파이썬으로 제작한 exe 실행파일을 Windows 서비스에 등록하여 실행시키는 방법에 대해 알아보도록 하겠습니다.
최종적으로 구현하고자 하는 방식은 아래와 같습니다.
[ 프로그램 구성 ]
- Watchdog.exe (Windows Service 등록)
- Main.exe
[ 프로그램 실행 방식 ]
1. 서비스 시작
1) Windows Service 에서 Watchdog 서비스(ex, Test Service) 시작
2) Watchdog.exe 가 Main.exe 프로그램 실행
2. 서비스 중지
1) Windows Service 에서 Watchdog 서비스(ex, Test Service) 중지
2) Watchdog.exe 가 Main.exe 프로그램 종료(kill)
1. 테스트 환경
Python : 3.7
servicemanager : 1.8.1
pywin32 : 227
2. 참조 소스
import servicemanager
import socket
import sys
import win32event
import win32service
import win32serviceutil
import time
import subprocess
import os
class TestService(win32serviceutil.ServiceFramework):
_svc_name_ = "TestService"
_svc_display_name_ = "Test Service"
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
socket.setdefaulttimeout(60)
self.is_running = False
def SvcStop(self):
# Main.exe Process Kill
subprocess.Popen("taskkill /im Main.exe /f", shell=True) # 서비스 중지 시 Main.exe 프로세스 taskkill 명령어로 중지.
time.sleep(1)
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
self.is_running = False # is_running 를 False로 바꿔 줌으로써 Main.exe 주기적 호출 막기
win32event.SetEvent(self.hWaitStop)
def SvcDoRun(self):
self.is_running = True
current_location = str(os.path.abspath(os.path.dirname(sys.argv[0]))) # 현재 위치 체크
while self.is_running: # self.is_running이 True인 경우에만 while 실행
rc = win32event.WaitForSingleObject(self.hWaitStop, 5000)
if rc == win32event.WAIT_OBJECT_0:
break
else:
subprocess.Popen([current_location + "\\Main.exe"]) # 현재 경로에 위치한 Main.exe 프로그램 실행
time.sleep(55)
if __name__ == '__main__':
if len(sys.argv) == 1:
servicemanager.Initialize()
servicemanager.PrepareToHostSingle(TestService)
servicemanager.StartServiceCtrlDispatcher()
else:
win32serviceutil.HandleCommandLine(TestService)
3. Windows Service exe 실행파일 만들기
Windows Service에 등록하기 위한 Watchdog 프로그램을 빌드하는 경우 pyinstaller를 활용하여 아래의 명령어로 exe 파일을 만들면 됩니다.
#pyinstaller -F --hidden-import=win32timezone -n Watchdog.exe py파일명
4. Windows Service 등록
"cmd창을 관리자 권한으로 실행" 한 다음 Watchdog 파일(ex, Watchdog.exe)이 위치한 경로로 이동해 줍니다.
그리고 아래의 명령어를 통해 서비스 등록 및 삭제를 진행하시면 됩니다.
1) Windows 서비스 등록
#exe파일명 --startup=auto install
2) Windows 서비스 삭제
#exe파일명 remove
'Development > 파이썬 [Python]' 카테고리의 다른 글
[Python] 파이썬 3.0 이전 버전에서 한글 주석 사용하기 (0) | 2022.10.18 |
---|---|
[Python] 파이썬 exe 파일 Windows 기본 icon 사용하기 (0) | 2021.02.08 |
[Python] 파이썬 SMTP를 통한 메일 전송 (0) | 2021.02.02 |
[Python] 웹 크롤링(Crawling) 주의사항 (0) | 2021.01.21 |
[Python] 파이썬 속도개선 (0) | 2021.01.05 |