개요

Flask 웹 서버를 Windows 서비스로 등록하는 방법을 알아보겠습니다.
Windows 서비스로 등록하면 Windows가 시작될 때 자동으로 실행되며,
Windows 서비스 관리자에서 시작/중지/재시작 등의 작업을 수행할 수 있습니다.


목차


개발환경

python 필수 패키지 설치

pip install --upgrade pip
pip install flask
pip install waitress
pip install pywin32

runserver.py


from os import environ
from waitress import serve
from win32 import servicemanager
import win32serviceutil,win32service, win32event, win32evtlogutil
from FlaskService import app

class FlaskAppService(win32serviceutil.ServiceFramework):
    _svc_name_ = 'FlaskAppService'
    _svc_display_name_ = 'Flask App Service'

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_, ''))
        self.main()

    def main(self):
        HOST = environ.get('SERVER_HOST', '0.0.0.0')
        PORT = int(environ.get('SERVER_PORT', '5555'))
        serve(app, host=HOST, port=PORT)

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

Windows 서비스 등록

# 서비스 설치
python runserver.py install
# Installing service FlaskAppService
# Service installed

# 서비스 시작
python runserver.py start
# Starting service FlaskAppService

# 서비스 상태 확인
python runserver.py status
# Service is running

# 서비스 중지 및 제거
python runserver.py stop
# Stopping service FlaskAppService
python runserver.py remove
# Removing service FlaskAppService


# 서비스 종료하는 중에서 에러가 발생할 경우
# ex : 다른 프로세서가 파일을 사용 중이기 때문에 프로세서가 엑세스 할 수 없습니다.
# 서비스를 중지하고 다시 시작하면 해결됩니다.

# 서비스 강제 종료
taskkill /f /pid [PID]

taskkill /f /fi "SERVICES eq {서비스명}"
# ex : taskkill /f /fi "SERVICES eq FlaskAppService"

Windows 서비스 관리

# 서비스 목록 확인
sc query

# 서비스 상태 확인
sc query FlaskAppService

# 서비스 시작
sc start FlaskAppService

# 서비스 중지
sc stop FlaskAppService

# 서비스 재시작
sc restart FlaskAppService

# 서비스 삭제
sc delete FlaskAppService

Windows 서비스 로그 확인

# 서비스 로그 확인
eventvwr.msc
# 이벤트 뷰어 > 응용 프로그램 및 서비스 로그 > FlaskAppService


Note: 만들고나니 내것이 아니었다.

Leave a comment