如何停止使用python创建的服务?

2024-05-16 13:37:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我基于这个代码创建了一个服务Is it possible to run a Python script as a service in Windows? If possible, how?
问题是我不能顺利地停止服务。
要停止服务,我需要每隔一段时间重新检查停止事件的标志。
有没有更好的方法来停止python中的服务? 这就是我目前试图停止服务的方式。在

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

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

def SvcDoRun(self):
    servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                          servicemanager.PYS_SERVICE_STARTED,
                          (self._svc_name_,''))
    myStatusThread = threading.Thread(target=win32event.WaitForSingleObject, args=(self.hWaitStop, win32event.INFINITE))
    myStatusThread.start()
    while True:
        if not myStatusThread.isAlive():
            sys.exit(0)
        else:
            doStuff()#do something that takes some time

因此,服务只会在“doStuff”完成后停止,这可能需要很长时间。
我想在用户停止服务后立即停止服务。在


Tags: 代码selfnoneinitdefservicemanagerargs
2条回答

事实上,你的问题是双重的:我如何测试一个项目,如何才能顺利地停止一个长期运行的例行程序?不幸的是,对第二部分并没有简单直接的答案。常见的用法是在代码中手动识别停止点,并在那里放置一个简单的例程来测试事件并引发自定义异常。这允许在退出之前在一个地方进行一些清理。在

你的代码可以变成(或多或少):

class EventException(Exception):
   def __init__(status):
       # allows to know where you exit from in case cleanup depends on it
       self.status = status

后来。。。在

^{pr2}$

这样的话:

  • 不需要辅助线程就可以测试事件
  • 你不能被迫等待完全处理停止服务
  • 如果您在处理过程中停止服务,那么您就有一个可供清理的净空间。在

最好使用NSSMinsead在winapi中编写此任务:

nssm install my_python_service
nssm set my_python_service Application C:\Python3\python.exe
nssm set my_python_service AppDirectory C:\myscript\
nssm set my_python_sevice AppParameters C:\myscrip\myscript_main_file.py

nssm set my_python_sevice Start SERVICE_AUTO_START
nssm run my_python_service

停止服务:

^{pr2}$

相关问题 更多 >