用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)