问题遇到的现象和发生背景
按照https://blog.csdn.net/weixin_45550143/article/details/101380837,这个的方法,成功写了一个windows服务(清理C盘)。
创建服务有两种方法,一个就是上面的方法,另一个方法就是随便写一个,然后用nssm install安装。
然后发现,如果用nssm创建,好处是如果服务没有停止,结束了进程,会重新再启动进程,但是CPU和磁盘占用率很高(貌似是time.sleep没生效)
如果按照以上的链接创建的话,CPU和磁盘占用率都不高,但是结束了进程后,服务就停止了。
用C写的话好像有canstop = false等,python 的这一块不知道在哪?
是不是还要自己再写一个守护进程?
用代码块功能插入代码,请勿粘贴截图
python
import win32serviceutil
import win32service
import win32event
import win32timezone
class PythonService(win32serviceutil.ServiceFramework):
# 服务名
svc_name = "PythonService"
# 服务在windows系统中显示的名称
svc_display_name = "Python Service Test"
# 服务的描述
svc_description = "This code is a Python service Test"
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
def SvcDoRun(self):
# 把自己的代码放到这里,就OK
# 等待服务被停止
win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)
def SvcStop(self):
# 先告诉SCM停止这个过程
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
# 设置事件
win32event.SetEvent(self.hWaitStop)
if name == 'main':
import sys
import servicemanager
if len(sys.argv) == 1:
try:
evtsrc_dll = os.path.abspath(servicemanager.__file__)
servicemanager.PrepareToHostSingle(PythonService)
servicemanager.Initialize('PythonService', evtsrc_dll)
servicemanager.StartServiceCtrlDispatcher()
except win32service.error as details:
import winerror
if details == winerror.ERROR_FAILED_SERVICE_CONTROLLER_CONNECT:
win32serviceutil.usage()
else:
win32serviceutil.HandleCommandLine(PythonService)
# 括号里参数可以改成其他名字,但是必须与class类名一致;
运行结果及报错内容
结果无报错,但是一旦结束进程,服务就停止了。
我的解答思路和尝试过的方法
用C写的话好像有canstop = false等,python 的这一块不知道在哪?
我想要达到的结果
Python中是否有类似C的方法,可以声明服务拒绝被停止?
提供参考实例【用python编写的Windows服务,不检测关闭事件并正常停止】,链接:https://www.cnpython.com/qa/179678