Python Language
Python을 사용하여 Windows 서비스 만들기
수색…
소개
Windows에서 헤드리스 프로세스 (UI 없음)를 서비스라고합니다. 명령 콘솔, Powershell 또는 작업 관리자의 서비스 탭과 같은 표준 Windows 컨트롤을 사용하여 제어 (시작, 중지 등) 할 수 있습니다. 좋은 예가 웹 응용 프로그램과 같은 네트워크 서비스를 제공하는 응용 프로그램이거나 다양한 백그라운드 보관 작업을 수행하는 백업 응용 프로그램 일 수 있습니다. Windows에서 서비스로 Python 응용 프로그램을 만들고 설치하는 여러 가지 방법이 있습니다.
서비스로 실행할 수있는 Python 스크립트
이 예제에 사용 된 모듈은 pywin32 (Windows 용 Python 확장 모듈)의 일부입니다. 파이썬을 어떻게 설치했는지에 따라, 이것을 별도로 설치해야 할 수도 있습니다.
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
class AppServerSvc (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)
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):
pass
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(AppServerSvc)
이것은 단지 상용구입니다. 아마도 별도의 스크립트를 호출하는 응용 프로그램 코드는 main () 함수에 포함됩니다.
이 서비스를 서비스로 설치해야합니다. 현재이 문제를 해결하는 가장 좋은 방법은 비 흡착 서비스 관리자 를 사용하는 것입니다. 이를 통해 서비스를 설치할 수 있으며 서비스가 실행하는 명령 행을 구성하기위한 GUI를 제공합니다. 파이썬의 경우 이것을 수행하면 한 번에 서비스를 생성 할 수 있습니다.
nssm install MyServiceName c:\python27\python.exe c:\temp\myscript.py
my_script.py가 위의 상용구 스크립트 인 경우 main () 함수에서 응용 프로그램 스크립트 또는 코드를 호출하도록 수정되었습니다. 이 서비스는 Python 스크립트를 직접 실행하지 않으며 Python 인터프리터를 실행하고 명령 줄의 기본 스크립트를 전달합니다.
또는 운영 체제 버전에 Windows Server Resource Kit에서 제공되는 도구를 사용하여 서비스를 만들 수도 있습니다.
Flask 웹 애플리케이션을 서비스로 실행하기
이것은 일반적인 예에 대한 변형입니다. 앱 스크립트를 가져 와서 서비스의 main()
함수에서 run()
메소드를 호출하면됩니다. 이 경우 WSGIRequestHandler
액세스하는 문제로 인해 다중 처리 모듈도 사용합니다.
import win32serviceutil
import win32service
import win32event
import servicemanager
from multiprocessing import Process
from app import app
class Service(win32serviceutil.ServiceFramework):
_svc_name_ = "TestService"
_svc_display_name_ = "Test Service"
_svc_description_ = "Tests Python service framework by receiving and echoing messages over a named pipe"
def __init__(self, *args):
super().__init__(*args)
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
self.process.terminate()
self.ReportServiceStatus(win32service.SERVICE_STOPPED)
def SvcDoRun(self):
self.process = Process(target=self.main)
self.process.start()
self.process.run()
def main(self):
app.run()
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(Service)
http://stackoverflow.com/a/25130524/318488 에서 개정