工具:Python 3.6.7
源码:
import servicemanager
import socket
import sys, os
import win32event
import win32service
import win32serviceutil
from flask import Flask
from flask import request
def installsvc(service):
win32serviceutil.InstallService(
service._svc_reg_class_,
service._svc_name_,
service._svc_display_name_,
startType = win32service.SERVICE_AUTO_START,
description = service._svc_description_
)
os.popen("sc start %s" % service._svc_name_).read()
def removesvc(service):
print(os.popen("sc stop %s" % service._svc_name_).read())
print(os.popen("sc delete %s" % service._svc_name_).read())
os.system('taskkill /IM ' + os.path.basename(sys.argv[0]) + ' /F')
win32serviceutil.RemoveService(service._svc_name_)
class WinService(win32serviceutil.ServiceFramework):
_svc_name_ = "ServiceName"
_svc_display_name_ = "Windows Service"
_svc_reg_class_ = '%s.%s' % ("WinService", _svc_name_)
_svc_description_ = "Windows Service"
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
socket.setdefaulttimeout(60)
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
def SvcDoRun(self):
app = Flask(__name__)
rc = None
# while rc != win32event.WAIT_OBJECT_0:
# pass
# rc = win32event.WaitForSingleObject(self.hWaitStop, 5000)
@app.route('/', methods=['GET', 'POST'])
def test():
if request.method == "GET":
return "ok"
# 使用flask自带的web服务器,监听本地所有地址的50000端口
app.run(host='0.0.0.0', port=50000)
if __name__ == '__main__':
if len(sys.argv) == 1:
servicemanager.Initialize()
servicemanager.PrepareToHostSingle(WinService)
servicemanager.StartServiceCtrlDispatcher()
elif sys.argv[1] == 'install':
try:
installsvc(WinService)
except:
removesvc(WinService)
installsvc(WinService)
print("excepr: Service " + WinService._svc_name_ + " reinstalled.")
else:
print("Service " + WinService._svc_name_ + " installed.")
elif sys.argv[1] == 'remove':
removesvc(WinService)
print("Service " + WinService._svc_name_ + " removed.")
else:
print("Please, use only 'install' or 'remove' keys")
打包:pyinstaller WinService.py
启动:WinService.exe install
检验:http://127.0.0.1:50000/
关闭:WinService.exe remove
------over------