python开发服务程序_使用Python写Windows Service服务程序

#!/usr/bin/env python#-*- coding: UTF8 -*-#importwin32serviceimportwin32conimporttime, sysimportdatetime

reload(sys)

sys.setdefaultencoding("utf8")classServiceManager(object):"""管理window服务"""

def __init__(self, name):"""name: 服务的名称"""self.name=name#启动或停止服务时等待操作成功等待时间

self.wait_time = 0.5

#启动或停止服务时最大等待时间,超过时返回超时提示

self.delay_time = 10self.scm=win32service.OpenSCManager(None, None, win32service.SC_MANAGER_ALL_ACCESS)ifself.is_exists():try:

self.handle=win32service.OpenService(self.scm, self.name, win32service.SC_MANAGER_ALL_ACCESS)exceptException, e:

self.log(e)else:print '服务 %s 没有安装'.encode('gbk') %self.namedefis_stop(self):"""检查服务是否停止"""flag=Falsetry:ifself.handle:

ret=win32service.QueryServiceStatus(self.handle)

flag= ret[1] !=win32service.SERVICE_RUNNINGexceptException, e:

self.log(e)returnflagdefstart(self):"""开启服务"""

try:ifself.handle:

win32service.StartService(self.handle, None)exceptException, e:

self.log(e)

status_info=win32service.QueryServiceStatus(self.handle)if status_info[1] ==win32service.SERVICE_RUNNING:return '启动服务%s成功'.encode('gbk') %self.nameelif status_info[1] ==win32service.SERVICE_START_PENDING:#如果服务正在启动中则延迟返回启动信息,直到启动成功,或返回启动时间过长信息

start_time =datetime.datetime.now()whileTrue:if (datetime.datetime.now() - start_time).seconds >self.delay_time:return '启动服务%s时间太长'.encode('gbk') %self.name

time.sleep(self.wait_time)if win32service.QueryServiceStatus(self.handle)[1] ==win32service.SERVICE_RUNNING:return '启动服务%s成功'.encode('gbk') %self.nameelse:return '启动服务%s失败'.encode('gbk') %self.namedefstop(self):"""停止服务"""

try:

status_info=win32service.ControlService(self.handle, win32service.SERVICE_CONTROL_STOP)exceptException, e:

self.log(e)if status_info[1] ==win32service.SERVICE_STOPPED:return '停止服务%s成功'.encode('gbk') %self.nameelif status_info[1] ==win32service.SERVICE_STOP_PENDING:

start_time=datetime.datetime.now()whileTrue:if (datetime.datetime.now() - start_time).seconds >self.delay_time:return '停止服务%s时间太长'.encode('gbk') %self.name

time.sleep(self.wait_time)if win32service.QueryServiceStatus(self.handle)[1] ==win32service.SERVICE_STOPPED:return '停止服务%s成功'.encode('gbk') %self.nameelse:return '停止服务%s失败'.encode('gbk') %self.namedefrestart(self):"""重启服务"""

if notself.is_stop():

self.stop()

self.start()returnwin32service.QueryServiceStatus(self.handle)defstatus(self):"""获取运行的状态"""

try:

status_info=win32service.QueryServiceStatus(self.handle)

status= status_info[1]if status ==win32service.SERVICE_STOPPED:return "STOPPED"

elif status ==win32service.SERVICE_START_PENDING:return "STARTING"

elif status ==win32service.SERVICE_STOP_PENDING:return "STOPPING"

elif status ==win32service.SERVICE_RUNNING:return "RUNNING"

exceptException, e:

self.log(e)defclose(self):"""释放资源"""

try:ifself.scm:

win32service.CloseServiceHandle(self.handle)

win32service.CloseServiceHandle(self.scm)exceptException, e:

self.log(e)defis_exists(self):"""windows服务是否已安装"""statuses=win32service.EnumServicesStatus(self.scm, win32service.SERVICE_WIN32, win32service.SERVICE_STATE_ALL)for (short_name, desc, status) instatuses:if short_name ==self.name:returnTruereturnFalsedeflog(self, exception):print(exception)if __name__=='__main__':

app= ServiceManager('PythonService')

msg= app.is_exists() #判断是否安装 (以下操作必须先判断服务是否存在)

#msg= app.is_stop() # 判断服务是否停止

#msg= app.status() # 查看服务的状态

#msg= app.start() # 开启服务

#msg= app.stop() # 暂停服务 (服务开启才能停止,else error)

#msg= app.restart() # 重启服务

print(msg)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值