zoukankan      html  css  js  c++  java
  • Python 实现windows后台服务

    # -*- coding: utf-8 -*-
    import sys
    
    import win32api
    import win32con
    import win32event
    import win32service
    import win32serviceutil
    import servicemanager
    import logging
    import os
    from http.server import HTTPServer, CGIHTTPRequestHandler
    
    
    class HTTPFilerServer(win32serviceutil.ServiceFramework):
        _svc_name_ = "HTTPFileServer"
        _svc_display_name_ = "HTTP File Server"
        _svc_description_ = "HTTP File Server"
        _svc_data_dir = 'D:\ScreenRecorder'
    
        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('[HTTPFileServer]')
            dirpath = os.path.abspath(self._svc_data_dir)
            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('HTTP File Server is Starting ...')
                self.start()
                self.logger.info('HTTP File Server Started')
                import time
                time.sleep(3)
                os.chdir(self._svc_data_dir)
                httpd = HTTPServer(('', 8080), CGIHTTPRequestHandler)
                httpd.serve_forever()
    
                win32event.WaitForSingleObject(self.stop_event, win32event.INFINITE)
                self.logger.info('HTTP File Server Shutdown')
            except BaseException as e:
                self.logger.warn('Exception : %s' % e)
                self.SvcStop()
    
        def SvcStop(self):
            self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
            self.logger.info('HTTP File Server is Stopping ...')
            self.stop()
            self.logger.info('HTTP File Server 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)
                win32api.SetFileAttributes(self._svc_data_dir, win32con.FILE_ATTRIBUTE_HIDDEN)
            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(HTTPFilerServer)
            servicemanager.StartServiceCtrlDispatcher()
        else:
            win32serviceutil.HandleCommandLine(HTTPFilerServer)
    
  • 相关阅读:
    Python3安装和虚拟环境配置
    CentOS中nginx安装部署
    CRM项目的整理---第一篇
    软件代码的发布
    ansible的roles使用
    ansible中的playbook脚本的介绍与使用
    ansible模块的介绍与使用
    Ansible的参数介绍
    ansible的介绍与安装
    linux网络配置,查看IP地址
  • 原文地址:https://www.cnblogs.com/fangying7/p/9569120.html
Copyright © 2011-2022 走看看