перезапуск службы python (при компиляции в exe) - PullRequest
0 голосов
/ 23 июня 2009

У меня есть сервис, следующий:

"""
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)

Я хочу, чтобы окна перезапускали службу, когда sys.ext () приводит к ее завершению. Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

4 голосов
/ 23 июня 2009

Опция, не связанная с программированием:

Служба windows может быть настроена для восстановления. Выберите тег recovery окна service properties. Вы можете выбрать Restart the Service после первого, второго или последующих сбоев.

Простая идея - почему бы вам не пропустить звонок sys.exit()? Таким образом, служба просто продолжает работать, и вам не нужно заниматься ее перезапуском. Если вам действительно необходимо знать, когда self.iVal достигает 5, вы можете сообщить об этом в журнал событий (и, возможно, сбросить счетчик).

2 голосов
/ 09 ноября 2010

У меня возникла точно такая же проблема: при попытке завершить работу службы на основе Python с кодом ошибки, чтобы инфраструктура служб могла перезапустить его. Я попробовал подход с ReportServiceStatus(win32service.SERVICE_STOP_PENDING, win32ExitCode=1, svcExitCode=1), а также sys.exit(1), но ни один из них не побудил Windows перезапустить службу, несмотря на то, что последняя отображается как ошибка в журнале событий. Я закончил тем, что не полагался на инфраструктуру служб и просто делал это:

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)
...