python实现windows Service服务程序

win32serviceutil.ServiceFramework是封装得很好的Windows服务框架,本文通过继承它来实现。

通过SvcDoRun方法,实现服务启动,运行服务内的业务代码。

通过SvcStop方法,停止服务。

WinPollManager.py代码如下:

import win32serviceutil
import win32service
import win32event
import winerror
import servicemanager
import time
import sys
import os
class WinPollManager(win32serviceutil.ServiceFramework):
"""
#1.安装服务
python WinPollManager.py install
#2.让服务自动启动
python WinPollManager.py --startup auto install
#3.启动服务
python WinPollManager.py start
#4.重启服务
python WinPollManager.py restart
#5.停止服务
python WinPollManager.py stop
#6.删除/卸载服务
python WinPollManager.py remove
"""
_svc_name_ = "py_agent_poll_manager" # 服务名
_svc_display_name_ = "py_agent_poll_manager" # 服务在windows系统中显示的名称
_svc_description_ = "python windows monitor agent" # 服务的描述
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
self.isAlive = True
self._poll_intvl = 30
def SvcDoRun(self):
while self.isAlive:
print 'monitor testing'
time.sleep(self._poll_intvl)
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
self.isAlive = False
if __name__ == '__main__':
if len(sys.argv) == 1:
try:
evtsrc_dll = os.path.abspath(servicemanager.__file__)
servicemanager.PrepareToHostSingle(WinPollManager)
servicemanager.Initialize('WinPollManager', evtsrc_dll)
servicemanager.StartServiceCtrlDispatcher()
except win32service.error, details:
if details[0] == winerror.ERROR_FAILED_SERVICE_CONTROLLER_CONNECT:
win32serviceutil.usage()
else:
win32serviceutil.HandleCommandLine(WinPollManager) # 括号里参数可以改成其他名字,但是必须与class类名一致;
打包exe文件
# -*- coding: utf-8 -*-
"""
pip install pyinstaller
pyinstaller -F -w WinPollManager.py
"""
from PyInstaller.__main__ import run
if __name__ == '__main__':
params = ['WinPollManager.py', '-F', '-c', '--icon=favicon.ico']
run(params)
打包成功后在dist目录下生成exe文件

执行方式

安装服务  WinPollManager.exe install

服务自动启动  WinPollManager.exe --startup auto install

启动服务  WinPollManager.exe start

重启服务  WinPollManager.exe restart

停止服务  WinPollManager.exe stop

删除/卸载服务  WinPollManager.exe remove

参考文章:

使用Python写Windows Service服务程序

1.背景 如果你想用Python开发Windows程序,并让其开机启动等,就必须写成windows的服务程序Windows Service,用Python来做这个事情必须要借助第三方模块pywin32 ...

Python 写Windows Service服务程序

1.需求 为什么要开发一个windows服务呢?之前做一个程序,必须要读取指定目录文件License, 因为其他程序也在读取这指定目录的License文件,且License不同时会修改License的 ...

C#Windows Service服务程序的安装/卸载、启动/停止 桌面客户端管理程序设计

C#Windows Service服务程序的安装/卸载.启动/停止 桌面客户端管理程序设计 关于Windows Service程序的安装与卸载如果每次使用命令行操作,那简直要奔溃了,太麻烦而且还容易出 ...

Python3 写Windows Service服务程序

用Python开发Windows Service,用Python来做这个事情必须要借助第三方模块pywin32,下载路径:https://pypi.org/project/pywin32/#files ...

使用Advanced Installer 13.1打包发布 Windows Service服务程序

原文: 使用Advanced Installer 13.1打包发布 Windows Service服务程序 项目中需要用到一个定时推送案件状态的需求,本人小菜一只,在同事建议下要写成一个windows ...

C#Windows Service程序的创建安装与卸载

C#Windows Service程序的创建安装与卸载 一.开发环境 操作系统:Windows7x64 sp1 专业版 开发环境:Visual studio 2013 编程语言:C# .NET版本: ...

C#写Windows Service(windows服务程序)

背景:        要学习使用一个新东西,我们必须知道他是个什么东西.对于我们此次研究的windows服务来说,他又是个什么东西,其实也没有什么高深的了. windows service概述: 一个 ...

C# 编写Windows Service(windows服务程序)【转载】

[转] Windows Service简介: 一个Windows服务程序是在Windows操作系统下能完成 ...

让自己的C++程序(非服务程序)运行为一个windows service

因为项目的一些变化和原因,需要把数据处理的一个后台程序创建为一个windows服务,运行以下命令能创建成功: sc create "MyApp Service Name" binP ...

随机推荐

entity framework 删除数据库出现错误的解决方法--最土但是很有效的方法

无法删除数据库,因为该数据库当前正在使用. public ChinaerContext() : base("name=ContextConn") { // Database.Set ...

Android悬浮窗实现 使用WindowManager

Android悬浮窗实现 使用WindowManager WindowManager介绍 通过Context.getSystemService(Context.WINDOW_SERVICE)可以获得  ...

jq常用的方法

.eq(i) //获取第几个元素 .text() //获取或设置元素文本内容 .html() //获取或设置元素html代码内容 .val() //获取或设置表单元素值 .attr() //获取或设置 ...

TCP的分层结构

TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂.开销不大的文件传输服务 ...

image

copy /B 1.jpg+2.jpg new.jpg 生成图用Stegsolve的file format查看文件格式 附带上一些图片格式的幻数,方便查阅.PNG = ‰PNG (89504E47)G ...

Python random模块 例子

最近用到随机数,就查询资料总结了一下Python random模块(获取随机数)常用方法和使用例子. 1.random.random  random.random()用于生成一个0到1的随机符点数: ...

Curl上传文件

curl -v -XPOST -H /thumbnail

linux 监控系统缓存和cpu

a=`free |head -n 2 |tail -n 1 |awk '{print $7}'`if [ $a -ge 900000 ];then     sync && echo 1 ...

SQL Server-字字珠玑,一纸详文,完全理解SERIALIZABLE最高隔离级别(基础系列收尾篇)

前言 对于上述锁其实是一个老生常谈的话题了,但是我们是否能够很明确的知道在什么情况下会存在上述各种锁类型呢,本节作为SQL Server系列末篇我们 来详细讲解下. Range-Lock 上述关于Ra ...