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

1 投票
1 回答
863 浏览
提问于 2025-04-27 23:22
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和Windows服务的相关内容。我需要把一个Python脚本转换成Windows服务。我已经完成了第一步,但我找不到停止它的方法。当我尝试停止服务时,出现了“[SC] ControlService FAILED 1061: 该服务此时无法接受控制消息。”

我没有无限循环来检查self.run_service标志,也没有调用sys.exit()来终止服务。你们能帮我解决这个问题吗?

暂无标签

1 个回答

1
def SvcStop(self):
    self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
    win32event.SetEvent(self.hWaitStop)
    web.httpserver.server.interrupt = KeyboardInterrupt()
     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

这是一个关于 wsgiserver.init.py 文件的源代码,里面的 start() 方法会检查是否有中断信号,以决定是否要停止服务器。

撰写回答