2014-05-08 16 views
7

Sto utilizzando il modello trovato qui: Is it possible to run a Python script as a service in Windows? If possible, how?Deploy Flask app come servizio Windows

Ecco la mia run.py, che ho installato come un servizio seguendo le istruzioni nel link qui sotto.

from app import app 

import win32serviceutil 
import win32service 
import win32event 
import servicemanager 
import socket 


class AppServerSvc (win32serviceutil.ServiceFramework): 
    _svc_name_ = "Flask App" 
    _svc_display_name_ = "Flask App" 

    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): 
     app.run(host = '192.168.1.6') 

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

Tuttavia, quando provo ad avviare il servizio ottengo il messaggio:

"Il servizio Flask App sul computer locale avviato e quindi arrestato Alcuni servizi si arrestano automaticamente se non sono in uso da. altri servizi o programmi. "

Qualche idea su cosa sto facendo male? Ho provato vari account utente - non penso che sia un problema di autorizzazione.

Grazie!

risposta

5

Non riesco ad accedere a WSGIRequestHandler in Flask fuori request, quindi uso Process.

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) 
+0

Grazie per il codice di esempio! L'ho usato con successo su _deploy_ su windows server. Tuttavia stavo ottenendo ** Errore interno del server ** ed ero in grado di risolvere solo con 'os.chdir (os.path.dirname (os.path.realpath (__ file__))) ' - il problema era il seguente, lo script è stato eseguito da una cartella 'win32' (come il servizio), quindi caricare qualsiasi file (aspettandosi di trovarsi nella' dir' dello script) ha causato un errore. – quapka

2

Calcolato - Avevo lasciato l'opzione di debug su app.run(). Una volta che l'ho rimosso, è bello andare!

Mentre il servizio si avvia e funziona correttamente (posso accedere all'app per flask da un altro computer in rete), non è in grado di fermarsi. Nella discussione con il modello pubblicato che ho usato, l'autore menziona qualcosa sull'impostazione di un flag per arrestare correttamente il servizio.

Qualcuno sa cosa intende e come codificarlo per interrompere correttamente il servizio?

-3

Ho aggiunto il mio codice in SvcStop() ultima riga. "self.ReportServiceStatus (win32service.SERVICE_STOPPED)"

Nel mio caso, funziona per l'interruzione del servizio.

from app import app 

import win32serviceutil 
import win32service 
import win32event 
import servicemanager 
import socket 


class AppServerSvc (win32serviceutil.ServiceFramework): 
    _svc_name_ = "Flask App" 
    _svc_display_name_ = "Flask App" 

    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) 
     # !important! to report "SERVICE_STOPPED" 
     self.ReportServiceStatus(win32service.SERVICE_STOPPED) 

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

    def main(self): 
     app.run(host = '192.168.1.6') 

if __name__ == '__main__': 
    win32serviceutil.HandleCommandLine(AppServerSvc) 
Problemi correlati