Szukaj…


Wprowadzenie

Procesy bezgłowe (bez interfejsu użytkownika) w systemie Windows nazywane są usługami. Można je kontrolować (uruchamiać, zatrzymywać itp.) Za pomocą standardowych elementów sterujących systemu Windows, takich jak konsola poleceń, Powershell lub karta Usługi w Menedżerze zadań. Dobrym przykładem może być aplikacja zapewniająca usługi sieciowe, takie jak aplikacja internetowa, lub może aplikacja do wykonywania kopii zapasowych, która wykonuje różne zadania archiwizacji w tle. Istnieje kilka sposobów tworzenia i instalowania aplikacji Python jako usługi w systemie Windows.

Skrypt w języku Python, który można uruchomić jako usługę

Moduły użyte w tym przykładzie są częścią pywin32 (rozszerzenia Python dla Windows). W zależności od sposobu zainstalowania Pythona może być konieczne zainstalowanie go osobno.

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)

To tylko płyta kotłowa. Twój kod aplikacji, prawdopodobnie wywołujący osobny skrypt, przejdzie do funkcji main ().

Będziesz także musiał zainstalować to jako usługę. Obecnie najlepszym rozwiązaniem tego problemu jest użycie Menedżera usług niessących . Umożliwia to zainstalowanie usługi i zapewnia interfejs GUI do konfigurowania wiersza poleceń wykonywanego przez usługę. W przypadku Pythona możesz to zrobić, co tworzy usługę za jednym razem:

nssm install MyServiceName c:\python27\python.exe c:\temp\myscript.py

Gdzie my_script.py to powyższy skrypt, zmodyfikowany w celu wywołania skryptu aplikacji lub kodu w funkcji main (). Zauważ, że usługa nie uruchamia bezpośrednio skryptu Python, uruchamia interpreter Pythona i przekazuje mu główny skrypt w wierszu poleceń.

Alternatywnie możesz użyć narzędzi zawartych w zestawie Windows Server Resource Kit dla swojej wersji systemu operacyjnego, więc utwórz usługę.

Uruchamianie aplikacji internetowej Flask jako usługi

Jest to wariacja na ogólny przykład. Wystarczy zaimportować skrypt aplikacji i wywołać jego metodę run() w funkcji main() . W tym przypadku używamy również modułu wieloprocesowego z powodu problemu z dostępem do 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)

Na podstawie http://stackoverflow.com/a/25130524/318488



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow