如何停止作为Windows服务运行的web.py服务器

问题描述:

import win32serviceutil 
import win32service 
import win32event 
import thread 
import json 
import sys 
import web 
import os 
import logging 
from ReleaseDistribution.server_actions import Actions 
from ReleaseDistribution import logging_setup 
import time 
from win32api import SetConsoleCtrlHandler 
import traceback 

class TestHttpService(win32serviceutil.ServiceFramework): 
_svc_name_ = "GlobalDeploymentReleaseService" 
_svc_display_name_ = "Global Deployment Release Service" 

def __init__(self, args): 
    win32serviceutil.ServiceFramework.__init__(self,args) 
    SetConsoleCtrlHandler(lambda x: True, True) 
    self.hWaitStop = win32event.CreateEvent(None,0,0,None) 

def SvcStop(self): 
    self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
    win32event.SetEvent(self.hWaitStop) 
    self.run_service=False 

def SvcDoRun(self): 

    try: 
     app = web.application(urls, globals()) 
     http_server = web.httpserver.runsimple(app.wsgifunc(), ('0.0.0.0', 8088)) 
     http_server.run() 
    # raise any exceptions, we can't usually recover well 
    except Exception as error: 
     logger.error('exception...{0}'.format(traceback.format_exc())) 
     sys.exit(-1) 

if __name__ == '__main__': 
    win32serviceutil.HandleCommandLine(TestHttpService) 

我是Python和窗口服务API的新手。我需要将python脚本转换为Windows服务。我设法做了第一步,但我找不到一种方法来阻止它。我得到了“[SC] ControlService FAILED 1061:此时此服务无法接受控制消息。”当如何停止作为Windows服务运行的web.py服务器

我我没有无限循环检查self.run_service标志并调用sys.exit()终止服务。你们可以帮我吗?

+0

你在使用什么库? – 2014-10-16 15:36:46

+0

@GamesBrainiac我使用web服务器的web.py,win32service将其转换为Windows服务 – user2391685 2014-10-16 18:03:55

def SvcStop(self): 
    self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
    win32event.SetEvent(self.hWaitStop) 
    web.httpserver.server.interrupt = KeyboardInterrupt() 

wsgiserver.init.py的源代码:start()方*询中断以确定是否停止服务器。

 while self.ready: 
     self.tick() 
     if self.interrupt: 
      while self.interrupt is True: 
       # Wait for self.stop() to complete. See _set_interrupt. 
       time.sleep(0.1) 
      if self.interrupt: 
       raise self.interrupt