2009-06-23 55 views
0

我有一个服务,具体如下:蟒蛇服务重新启动时(编译EXE)

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

我希望Windows重新启动时sys.ext()导致服务退出服务。有谁知道如何让它做到这一点?

+0

试试这个问题的答案:[http://stackoverflow.com/questions/220382/how-can-a-windows-service-以编程方式重新启动本身](http://stackoverflow.com/questions/220382/how-can-a-windows-service-programmatically-restart-itself) – 2009-06-23 10:30:10

回答

4

非编程相关的选项:

Windows服务可以配置为恢复。选择service properties窗口的recovery标签。在第一次,第二次或后续故障后,您可以选择Restart the Service

一个简单的想法 - 为什么不放弃调用sys.exit()?这种方式服务只是继续运行,你不必处理重新启动它。如果您真的需要知道何时self.iVal达到5,您可以报告给事件记录器(也许重置计数器)。

+0

我已经这样做,但它仍然不会重新启动服务一分钟后。 – williamtroup 2009-06-23 10:54:06

+0

在系统/服务控制管理器中查找事件日志项目中的线索。 – gimel 2009-06-23 11:15:18

2

我有完全相同的问题:尝试使用基于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)