riavvio del servizio python (quando compilato in exe)
-
06-07-2019 - |
Domanda
Ho un servizio, come segue:
"""
The most basic (working) CherryPy 3.1 Windows service possible.
Requires Mark Hammond's pywin32 package.
"""
import cherrypy
import win32serviceutil
import win32service
import sys
import __builtin__
__builtin__.theService = None
class HelloWorld:
""" Sample request handler class. """
def __init__(self):
self.iVal = 0
@cherrypy.expose
def index(self):
try:
self.iVal += 1
if self.iVal == 5:
sys.exit()
return "Hello world! " + str(self.iVal)
except SystemExit:
StopServiceError(__builtin__.theService)
class MyService(win32serviceutil.ServiceFramework):
"""NT Service."""
_svc_name_ = "CherryPyService"
_svc_display_name_ = "CherryPy Service"
_svc_description_ = "Some description for this service"
def SvcDoRun(self):
__builtin__.theService = self
StartService()
def SvcStop(self):
StopService(__builtin__.theService)
def StartService():
cherrypy.tree.mount(HelloWorld(), '/')
cherrypy.config.update({
'global':{
'tools.log_tracebacks.on': True,
'log.error_file': '\\Error_File.txt',
'log.screen': True,
'engine.autoreload.on': False,
'engine.SIGHUP': None,
'engine.SIGTERM': None
}
})
cherrypy.engine.start()
cherrypy.engine.block()
def StopService(classObject):
classObject.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
cherrypy.engine.exit()
classObject.ReportServiceStatus(win32service.SERVICE_STOPPED)
def StopServiceError(classObject):
classObject.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
cherrypy.engine.exit()
classObject.ReportServiceStatus(serviceStatus=win32service.SERVICE_STOPPED, win32ExitCode=1, svcExitCode=1)
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(MyService)
Voglio che Windows riavvii il servizio quando sys.ext () fa uscire il servizio. Qualcuno sa come farlo?
Soluzione
Un'opzione non legata alla programmazione:
Un servizio Windows può essere configurato per il recupero. Seleziona il tag recovery
della finestra proprietà del servizio
. Puoi selezionare Riavvia il servizio
dopo il primo, secondo o successivo errore.
Un'idea semplice: perché non elimini la chiamata sys.exit ()
? In questo modo il servizio continua a funzionare e non devi occuparti di riavviarlo. Se hai davvero bisogno di sapere quando self.iVal
raggiunge 5
, puoi riferire al logger degli eventi (e forse resettare il contatore).
Altri suggerimenti
Ho avuto esattamente lo stesso problema: cercare di uscire da un servizio basato su Python con un codice di errore in modo che il framework dei servizi possa riavviarlo. Ho provato l'approccio con ReportServiceStatus (win32service.SERVICE_STOP_PENDING, win32ExitCode = 1, svcExitCode = 1)
e sys.exit (1)
ma nessuno di loro ha richiesto il riavvio di Windows il servizio, nonostante quest'ultimo venga visualizzato come errore nel registro eventi. Ho finito per non fare affidamento sul framework dei servizi e solo facendo questo:
def SvcDoRun(self):
restart_required = run_service() # will return True if the service needs
# to be restarted
if restart_required:
subprocess.Popen('sleep 5 & sc start %s' % self._svc_name_, shell=True)