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?

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top