写一个Python的windows服务
1. 安装pywin32和pyinstaller
pip install pywin32
pip install pyinstaller
2.写一个服务Demo
# -*- coding: utf-8 -*-
import sys
import win32event
import win32service
import win32serviceutil
import servicemanager
import subprocess
import logging
import inspect
import os
class ScreenRecorderService(win32serviceutil.ServiceFramework):
_svc_name_ = "ScreenRecorderService"
_svc_display_name_ = "Screen Recorder Service"
_svc_description_ = "Screen Recorder Service"
_svc_data_dir = 'D:\\ScreenRecorder'
_ffmpeg_proc = None
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.stop_event = win32event.CreateEvent(None, 0, 0, None)
self.logger = self._getLogger()
def _getLogger(self):
logger = logging.getLogger('[ScreenRecorderService]')
this_file = inspect.getfile(inspect.currentframe())
dirpath = os.path.abspath(os.path.dirname(this_file))
handler = logging.FileHandler(os.path.join(dirpath, self._svc_name_ + ".log"))
formatter = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.INFO)
return logger
def SvcDoRun(self):
self.ReportServiceStatus(win32service.SERVICE_START_PENDING)
try:
self.ReportServiceStatus(win32service.SERVICE_RUNNING)
self.logger.info('Screen Recorder Service is Starting ...')
self.start()
self.logger.info('Screen Recorder Service Started')
import time
time.sleep(3)
self.logger.info('Screen Recorder Service ffmpeg run')
ffmpeg = r'C:\Windows\System32\ffmpeg.exe'
cmd = r'%s -f gdigrab -framerate 10 -i desktop D:\\output.mkv -y' % ffmpeg
self.logger.info(cmd)
self._ffmpeg_proc = subprocess.Popen(cmd, shell=True)
try:
sys.exit(self._ffmpeg_proc.wait())
except SystemExit as e:
self.logger.warn('Exception : %s' % e)
self.logger.info('Screen Recorder Service ffmpeg stop')
win32event.WaitForSingleObject(self.stop_event, win32event.INFINITE)
self._ffmpeg_proc.kill()
self.logger.info('Screen Recorder Service Done!')
except BaseException as e:
self.logger.warn('Exception : %s' % e)
self.SvcStop()
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
self.logger.info('Screen Recorder Service is Stopping ...')
self.stop()
self.logger.info('Screen Recorder Service Stopped')
win32event.SetEvent(self.stop_event)
self.ReportServiceStatus(win32service.SERVICE_STOPPED)
def start(self):
if not os.path.exists(self._svc_data_dir):
os.mkdir(self._svc_data_dir)
else:
pass
def stop(self):
pass
def log(self, msg):
servicemanager.LogInfoMsg(str(msg))
if __name__ == "__main__":
if len(sys.argv) == 1:
servicemanager.Initialize()
servicemanager.PrepareToHostSingle(ScreenRecorderService)
servicemanager.StartServiceCtrlDispatcher()
else:
win32serviceutil.HandleCommandLine(ScreenRecorderService)
3.冻结二进制
pyinstaller -F MyService.py --hidden-import=win32timezone
4.运行服务
dist\MyService.exe install
sc start MyService
写一个Python的windows服务的更多相关文章
- 写一个python的服务监控程序
写一个python的服务监控程序 前言: Redhat下安装Python2.7 rhel6.4自带的是2.6, 发现有的机器是python2.4. 到python网站下载源代码,解压到Redhat上, ...
- Python做windows服务
Python做windows服务(多进程服务),并结束多进程 Python中_,__,__xx__的区别 在注册MyWinService服务时,再使用 "sc delete 服务器名称&qu ...
- 如何创建一个标准的Windows服务
出处:http://www.cnblogs.com/wuhuacong/archive/2009/02/11/1381428.html 如何创建一个标准的Windows服务 在很多时候,我们需要一个定 ...
- 如何手动写一个Python脚本自动爬取Bilibili小视频
如何手动写一个Python脚本自动爬取Bilibili小视频 国庆结束之余,某个不务正业的码农不好好干活,在B站瞎逛着,毕竟国庆嘛,还让不让人休息了诶-- 我身边的很多小伙伴们在朋友圈里面晒着出去游玩 ...
- laravel学习:php写一个简单的ioc服务管理容器
php写一个简单的ioc服务管理容器 原创: 陈晨 CoderStory 2018-01-14 最近学习laravel框架,了解到laravel核心是一个大容器,这个容器负责几乎所有服务组件的实例化以 ...
- Python-windows服务-重启自动化
一. 前言 有了上一篇的“python初学”的基础,咱们就有了python的开发包,有了开发环境IDE,那我们就可以干活了.我的第一个选题就是让我们的windows服务可以按照我们的意愿进行自动重启. ...
- python管理Windows服务
上一篇介绍了pywin32模块,它的win32service子模块提供了对服务管理API的包装,相关API如下: ChangeServiceConfig ChangeServiceConfig2 Cl ...
- 如何成功发布一个MSMQ的Windows服务
因为MSMQ的使用需要不断的查看队列是否有新消息,所以一般是结合Windows的服务,当然也可以用一个不关闭的Winform程序,不过前者更好一些,不怕被人误关. 完成MSMQ的WindowsServ ...
- 写一个python脚本监控在linux中的进程
在虚拟机中安装Linux中的CentOS7系统 https://baijiahao.baidu.com/s?id=1597320700700593557&wfr=spider&for= ...
随机推荐
- 基于Redis的限流系统的设计
本文讲述基于Redis的限流系统的设计,主要会谈及限流系统中限流策略这个功能的设计:在实现方面,算法使用的是令牌桶算法来,访问Redis使用lua脚本. 1.概念 In computer netw ...
- 《Django By Example》
<Django By Example>第六章 中文 翻译 (个人学习,渣翻) 书籍出处:https://www.packtpub.com/web-development/django-ex ...
- 在Windows使用VC编译ICU
1 编译过程在Cygwin下进行,所以必须得安装Cygwin,并且加上Automake, autoconf, make, ar等选项 2 打开命令行窗口,设置环境变量,主要是可以启动cygwin的ba ...
- MySQL 乐观锁 悲观锁 共享锁 排他锁
乐观锁 乐观锁是逻辑概念上的锁,不是数据库自带的,需要我们自己去实现.乐观锁是指操作数据库时(更新操作),想法很乐观,认为这次的操作不会导致冲突,在操作数据时,并不进行任何其他的特殊处理(也就是不加锁 ...
- git branch 新建,推送与删除
在开发的许多时候我们都需要使用git提供的分支管理功能. 1.新建本地分支:git checkout -b test 新建一个名为:test 的本地分支. 2.提交本地分支:git push ori ...
- Go连接MySql数据库Error 1040: Too many connections错误解决
原文:https://my.oschina.net/waknow/blog/205654 摘要: 使用Go链接数据库时,由于连接释放不当会在一段时间以后产生too many connections的错 ...
- Kotlin Android Studio 环境搭建
Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,由 JetBrains 设计开发并开源. Kotlin 可以编译成Java字节码,也可以编 ...
- zsh 安装powerline 主题特效
查看当前使用的shell脚本是哪一种 echo $0 1. 安装Powerline 使用pip指令,安装方法: pip install powerline-status 如果没有,则先 ...
- 设计模式--抽象工厂模式C++实现
抽象工厂模式C++实现 1定义 为创建一组相关或者依赖的对象提供一个接口,且无需指定他们的具体类 2类图 3实现 class AbstractProduct { protected: Abstract ...
- qt5.2.1在linux下去除最大化和最小化按钮
#include <QtGui/QGuiApplication> #include <QDebug> #include <QScreen> #include &qu ...