欢迎访问宙启技术站
智能推送

win32service模块中创建自定义Windows服务的示例

发布时间:2023-12-26 15:22:18

win32service模块是Python中的一个模块,用于创建和管理自定义的Windows服务。下面是一个使用win32service模块创建自定义Windows服务的示例:

import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import os
import sys

# 自定义Windows服务类
class MyService(win32serviceutil.ServiceFramework):
    _svc_name_ = 'MyService'
    _svc_display_name_ = 'My Service'

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
        socket.setdefaulttimeout(60)
        self.is_running = True
  
    # 开始服务
    def SvcStart(self):
        self.is_running = True
        self.ReportServiceStatus(win32service.SERVICE_RUNNING)
        self.main()

    # 停止服务
    def SvcStop(self):
        self.is_running = False
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    # 主要逻辑
    def main(self):
        while self.is_running:
            # 自定义的服务逻辑
            # 例如,每隔一段时间打印一条日志
            with open('log.txt', 'a') as f:
                f.write('Service is running...
')
            # 模拟服务的工作时间间隔
            win32event.WaitForSingleObject(self.hWaitStop, 5000)

# 安装服务
def install_service():
    args = ['--username', 'myuser', '--password', 'mypassword', 'MyService.py', 'install']
    win32serviceutil.HandleCommandLine(MyService, module_name="MyService", customInstallArgs=args)

# 卸载服务
def uninstall_service():
    win32serviceutil.HandleCommandLine(MyService, module_name="MyService", customInstallArgs=['--uninstall'])
  
# 主函数
def main():
    if len(sys.argv) == 1:
        # 如果没有命令行参数,则以控制台程序的形式运行服务
        servicemanager.Initialize()
        servicemanager.PrepareToHostSingle(MyService)
        servicemanager.StartServiceCtrlDispatcher()
    else:
        # 如果有命令行参数,则根据命令执行相应操作
        if sys.argv[1] == 'install':
            install_service()
        elif sys.argv[1] == 'uninstall':
            uninstall_service()

if __name__ == '__main__':
    main()

上述示例中定义了一个名为MyService的自定义Windows服务类,该类继承自win32serviceutil.ServiceFramework。其中,_svc_name__svc_display_name_分别指定了服务的名称和显示名称。

服务类中的SvcStart方法用于定义启动服务时的逻辑,SvcStop方法用于定义停止服务时的逻辑,main方法用于定义服务的主要逻辑。

main函数中,通过判断命令行参数来决定执行安装或卸载服务的操作。

在自定义Windows服务的逻辑部分,可以根据实际需求编写适当的逻辑,例如定时执行某个任务、监控某个目录等。

要创建和管理上述自定义的Windows服务,可以通过命令行执行相应的命令,例如:

- 安装服务:python MyService.py install

- 卸载服务:python MyService.py uninstall

安装或卸载服务时可能需要提供用户名和密码等参数,具体可根据实际情况调整。

以上是使用win32service模块创建自定义Windows服务的示例,通过上述示例可以根据实际需求进行调整和扩展。