zoukankan      html  css  js  c++  java
  • python管理Windows服务

    上一篇介绍了pywin32模块,它的win32service子模块提供了对服务管理API的包装,相关API如下:

    ChangeServiceConfig
    ChangeServiceConfig2
    CloseServiceHandle
    ControlService
    CreateDesktop
    CreateService
    CreateWindowStation
    DeleteService
    EnumDependentServices
    EnumServicesStatus
    EnumServicesStatusEx
    EnumWindowStations
    GetProcessWindowStation
    GetServiceDisplayName
    GetServiceKeyName
    GetThreadDesktop
    GetUserObjectInformation
    LockServiceDatabase
    OpenDesktop
    OpenInputDesktop
    OpenSCManager
    OpenService
    OpenWindowStation
    QueryServiceConfig
    QueryServiceConfig2
    QueryServiceLockStatus
    QueryServiceObjectSecurity
    QueryServiceStatus
    QueryServiceStatusEx
    SetServiceObjectSecurity
    SetServiceStatus
    SetUserObjectInformation
    StartService
    UnlockServiceDatabase
    

     有了这些API,完成一些服务的基本操作,比如安装服务、停止服务、启动服务等完全不在话下,只不过都是直接调用API而已。

    不过pywin32还有一个对win32service模块的包装,叫做 win32serviceutil,使用它可以更方便地对服务进行控制。

    InstallService(pythonClassString, serviceName, displayName, startType = None, 
        errorControl = None, bRunInteractive = 0, serviceDeps = None, userName = None, 
        password = None, exeName = None, perfMonIni = None,perfMonDll = None, 
        exeArgs = None,description = None, delayedstart = None)  #安装服务
    
    ChangeServiceConfig(pythonClassString, serviceName, startType = None, 
        errorControl = None, bRunInteractive = 0, serviceDeps = None, 
        userName = None, password = None,exeName = None, displayName = None, 
        perfMonIni = None, perfMonDll = None,exeArgs = None,
        description = None, delayedstart = None)  #更改服务设置
    
    #以上两个函数的第一个参数pythonClassString是为Python编写的Windows服务准备的,非Python服务则不需要,直接填None即可
    
    RemoveService(serviceName)  #删除服务
    ControlService(serviceName, code, machine = None)  #控制服务,code的具体定义参考MSDN的对ControlService的介绍
    StopService(serviceName, machine = None) #停止服务
    StartService(serviceName, args = None, machine = None) #启动服务
    RestartService(serviceName, args = None, waitSeconds = 30, machine = None) #重启服务
    QueryServiceStatus(serviceName, machine=None)  #查询服务状态

     大部分API只需要提供服务名称就可以了,调用起来非常简单。

    比如 win32serviceutil.StopService("Spooler") 就可以停止Spooler服务了。

    对于 win32serviceutil.QueryServiceStatus()这个函数,它实际返回的是win32service.QueryServiceStatus的返回结果。

    从MSDN和pywin32的帮助文件可知,win32service.QueryServiceStatus的返回值是一个元组,如下:

    SERVICE_STATUS Object
    A Win32 service status object is represented by a tuple:
    Items
    [0] int : serviceType
    The type of service.
    [1] int : serviceState
    The current state of the service.
    [2] int : controlsAccepted
    The controls the service accepts.
    [3] int : win32ExitCode
    The win32 error code for the service.
    [4] int : serviceSpecificErrorCode
    The service specific error code.
    [5] int : checkPoint
    The checkpoint reported by the service.
    [6] int : waitHint
    The wait hint reported by the service
    

     服务状态实际上是第1个元素(从0开始计数)

    写个函数包装一下,并附带上控制功能:

    import win32service
    import win32serviceutil
    import win32api
    
    def GetSvcStatus(svcname):
        svcstatusdic = {
        #The service continue is pending.
        win32service.SERVICE_CONTINUE_PENDING:"continue pending", 
        #The service pause is pending.
        win32service.SERVICE_PAUSE_PENDING:"pause pending",
        #The service is paused.
        win32service.SERVICE_PAUSED:"paused" , 
        #The service is running.
        win32service.SERVICE_RUNNING:"running",
        #The service is starting.
        win32service.SERVICE_START_PENDING:"start pending", 
        # The service is stopping.
        win32service.SERVICE_STOP_PENDING:"stop pending" ,
        #The service is not running.
        win32service.SERVICE_STOPPED:"stoped"
        }
        status = win32serviceutil.QueryServiceStatus(svcname)
        if status:
            return svcstatusdic.get(status[1],"unknown")
        else:
            return "error"
    
    svcname = "Spooler"
    status = GetSvcStatus(svcname)
    print("{} current status : {}".format(svcname,status))
    if status == "running":
        win32serviceutil.StopService(svcname)
    else:
        win32serviceutil.StartService(svcname)
    win32api.Sleep(1000)
    status = GetSvcStatus(svcname)
    print("After Control,{} current status : {}".format(svcname,status))

    输出结果如下:

    掌握该模块的使用,对Windows平台的运维管理还是有相当帮助的。

  • 相关阅读:
    go系列之数组
    node.js 下依赖Express 实现post 4种方式提交参数
    javascript的数据类型
    工作中常用的mysql操作
    Linux如何查看进程、杀死进程、启动进程等常用命令
    局域网两台笔记本如何使用svn
    固定电话的验证
    phpexcel来做表格导出(多个工作sheet)
    char.js专门用来做数据统计图
    Out of resources when opening file 错误解决
  • 原文地址:https://www.cnblogs.com/achillis/p/10462899.html
Copyright © 2011-2022 走看看