Development/파이썬 [Python]

[Python] 파이썬 Windows 서비스 등록

요체크다 2021. 2. 6. 09:00
반응형

 이번 시간에는 파이썬으로 제작한 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파일명

[ Watchdog exe 파일 생성 ]


4. Windows Service 등록

 "cmd창을 관리자 권한으로 실행" 한 다음 Watchdog 파일(ex, Watchdog.exe)이 위치한 경로로 이동해 줍니다.

그리고 아래의 명령어를 통해 서비스 등록 및 삭제를 진행하시면 됩니다.

 

 1) Windows 서비스 등록

   #exe파일명 --startup=auto install

[ Windows Service 등록 ]
[ Windows Service에 등록된 화면 ]

 2) Windows 서비스 삭제

   #exe파일명 remove

[ Windows Service 삭제 ]

반응형