用python写windows服务非常多的坑,最后全解决了。最后发现,微软禁止了桌面交互,那搞个锤子。放弃了。老老实实加注册表吧。
# encoding=utf-8
import win32timezone
from logging.handlers import TimedRotatingFileHandler
import win32serviceutil
import win32service
import win32event
import os
import logging
import inspect
import time
import shutil
import servicemanager
import threading
import datetime
import sys
import psutil
import threading
tostop = False
def write(text):
nowtime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
flname = "D:\\log" + "\\" + "service_log" + nowtime[:10] + ".txt"
f = open(flname, 'a+')
if not isinstance(text, str):
text = str(text)
f.write(" [" + nowtime + "] \n" + text + "\n")
f.close()
with open("d:\\userdata\\config\\autorun.ini", "r", encoding="utf-8") as f:
fl = f.readline()
def main(target):
processlist = psutil.pids()
for pid in processlist:
if psutil.Process(pid).name() == print(os.path.basename(target)):
print("已经运行,忽略")
else:
res = os.system(target)
# print(res)
break
def strt(fullpath):
threading.Thread(name="main", target=main, kwargs={"target": fullpath}, daemon=True).start()
class PythonService(win32serviceutil.ServiceFramework):
_svc_name_ = "Clearjob2027" #服务名
_svc_display_name_ = "Clearjob 2023" #job在windows services上显示的名字
_svc_description_ = "Clear system files" #job的描述
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
self.logger = self._getLogger()
self.path = 'D:\\tmp'
self.T = time.time()
self.run = True
global tostop
tostop = False
def _getLogger(self):
'''日志记录'''
logger = logging.getLogger('[PythonService]')
this_file = inspect.getfile(inspect.currentframe())
dirpath = os.path.abspath(os.path.dirname(this_file))
if os.path.isdir('%s\\log' % dirpath): #创建log文件夹
pass
else:
os.mkdir('%s\\log' % dirpath)
dir = '%s\\log' % dirpath
handler = TimedRotatingFileHandler(os.path.join("D:\\UserData\\log", "Clearjob.log"), when="midnight", interval=1, backupCount=20)
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.logger.info("service is run....")
while tostop != True:
global fl
strt(fl)
time.sleep(10)
# try:
# while self.run:
# self.logger.info('---Begin---')
# while True:
# for path, name, file in os.walk('D:\\tmp'):
# with open("D:\\Tmp\\a.txt", "a+", encoding="utf-8") as f:
# f.write("a" + str(1) + "\n")
# import ctypes # An included library with Python install.
# ctypes.windll.user32.MessageBoxW(0, "Your text", "Your title", 1)
# self.logger.info('---End---')
# time.sleep(10)
# except Exception as e:
# self.logger.info(e)
# time.sleep(60)
def SvcStop(self):
self.logger.info("service is stop....")
global tostop
tostop = True
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
self.run = False
if __name__ == '__main__':
if len(sys.argv) == 1:
servicemanager.Initialize()
servicemanager.PrepareToHostSingle(PythonService)
servicemanager.StartServiceCtrlDispatcher()
else:
win32serviceutil.HandleCommandLine(PythonService)
文章描述了一位开发者使用Python创建Windows服务时遇到的问题,包括诸多坑点,最终因微软禁止桌面交互而放弃直接创建服务,转而考虑使用注册表来实现。代码示例展示了服务的初始化、日志记录和进程检查等功能。
7842

被折叠的 条评论
为什么被折叠?



