перезапуск службы python (при компиляции в exe)
-
06-07-2019 - |
Вопрос
У меня есть сервис, как показано ниже:
"""
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 () заставляет службу завершать работу. Кто-нибудь знает, как это сделать?
Решение
Не связанная с программированием опция:
Служба Windows может быть настроена для восстановления. Выберите тег recovery
в окне свойства службы
. Вы можете выбрать Перезапустить службу
после первого, второго или последующих сбоев.
Простая идея - почему бы вам не отбросить вызов sys.exit ()
? Таким образом, служба просто продолжает работать, и вам не нужно заниматься ее перезапуском. Если вам действительно необходимо знать, когда self.iVal
достигает значения 5
, вы можете сообщить об этом в журнал событий (и, возможно, сбросить счетчик).
Другие советы
У меня была точно такая же проблема: попытка заставить службу на основе 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)