Обработка sys.exit() в сервисе CherryPy
-
05-07-2019 - |
Вопрос
Когда вы запускаете/останавливаете службу Python Cherrypy (скомпилированную с помощью py2exe), это работает нормально. Когда я получаю sys.exit()
вызова (из моего обработчика ошибок), Cherry завершает работу, но служба продолжает зависать.
Код:
import cherrypy
import win32serviceutil
import win32service
import sys
SERVICE = None
class HelloWorld:
""" Sample request handler class. """
def __init__(self):
self.iVal = 0
@cherrypy.expose
def index(self):
self.iVal += 1
if self.iVal == 5:
StopService(SERVICE)
return "Hello world! " + str(self.iVal)
class MyService(win32serviceutil.ServiceFramework):
"""NT Service."""
_svc_name_ = "CherryPyService"
_svc_display_name_ = "CherryPy Service"
_svc_description_ = "Some description for this service"
def SvcDoRun(self):
SERVICE = self
StartService()
def SvcStop(self):
StopService(SERVICE)
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)
if __name__ == '__main__':
print sys.argv
win32serviceutil.HandleCommandLine(MyService)
Будем признательны любому совету :)
Решение
Я не совсем уверен, где sys.exit
откуда поступает звонок или какое поведение вы предпочитаете.Когда sys.exit
называется, однако, это вызывает SystemExit
исключение.Вы можете перехватить это и продолжить свой путь:
import sys
try:
sys.exit()
except SystemExit:
print "Somebody called sys.exit()."
print "Still running."
...или используйте finally
чтобы сделать некоторую очистку:
try:
do_something()
finally:
cleanup()
Другие советы
остановка сервера CherryPy через http рекомендует cherrypy.engine.exit()
вместо sys.exit()
.
Не связан с StackOverflow