2014-10-16 195 views
1
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

回答

1
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