수색…


소개

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 에서 개정



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow