import psutil,time import pymysql import redis import logging import win32serviceutil import win32service import win32event import inspect import os import signal import json import win32timezone host = '127.0.0.1' rport =16379 # redis服务端口 mport =3307 # mysql服务端口 class checkProces : def handle(r,conn,buildStatus,sceneStatus): flagid=r.exists('build:scene:status:id') logging.info("** flagid %s " ,flagid) if flagid : id =r.get('build:scene:status:id') id = int(id.replace('L', '')) logging.info("**build %s " ,id) r.delete('build:scene:status') r.delete('build:scene:status:id') conn.ping(reconnect=True) cur = conn.cursor() sql1 = "UPDATE t_scene_file_build set use_build_time=TIMESTAMPDIFF(SECOND,start_build_time,NOW())*1000 ,build_status={0} WHERE id= {1}".format(buildStatus,id) sql2 = "UPDATE t_scene set status={0} WHERE scene_code = (SELECT scene_num FROM t_scene_file_build WHERE id = {1} )".format(sceneStatus,id) res1 = cur.execute(sql1) res2 = cur.execute(sql2) logging.info(res1) logging.info(res2) conn.commit() conn.close() win32serviceutil.StopService("checkLaserProcess") def execute() : seetingjson=os.environ.get("FDMGEA_HOME")+"\\bin\\resources\\static\\setting.json" javaPort=json.load(open(seetingjson,'r',encoding="utf-8"))['javaPort'] buildCallPath=json.load(open(seetingjson,'r',encoding="utf-8"))['buildCallPath'] logging.basicConfig(filename=buildCallPath+'\\monitor.log', format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', level = logging.INFO, filemode='a', datefmt='%Y-%m-%d%I:%M:%S %p') r = redis.StrictRedis(host=host,port=rport,db=4,decode_responses=True) conn = pymysql.connect(host=host, port=mport, db="laser", user="root", password="laser", charset='utf8') print("\n") logging.info('\n** Search Running Process Using List Comprehension **') # Pass the Process that needs to be checked & Check, If process run under this user. MainLoader = 'MainLoader.exe' laser = 'laser.exe' TIME = 5 # 程序状态检测间隔(单位:分钟) file = open(buildCallPath+'\\monitor.log', 'w+').close() try: while 1: time.sleep(TIME) flag=r.exists('build:scene:status') stepflag =r.exists('build:scene:step') if flag and stepflag : pid_counter = 0 MainLoaderFlag=0 laserFlag=0 JavaPortFlag =0 step =r.get('build:scene:step') step = int(step) for procObj in psutil.process_iter(['pid','ppid', 'name', 'username']): if MainLoader.lower() in procObj.name().lower(): MainLoaderFlag=procObj.pid if laser.lower() in procObj.name().lower(): laserFlag=procObj.ppid() netConnections= psutil.net_connections() for con in netConnections : if con.raddr != tuple(): if con.raddr.port == javaPort and psutil.Process(con.pid).name() == 'java.exe': JavaPortFlag=con.pid break if con.laddr != tuple(): if con.laddr.port == javaPort and psutil.Process(con.pid).name() == 'java.exe': JavaPortFlag=con.pid break logging.info("** MainLoaderFlag = %s ,laserFlag= %s,JavaPortFlag=%s",MainLoaderFlag,laserFlag,JavaPortFlag) if JavaPortFlag==0: logging.info("** only Process java to Run...") os.kill(MainLoaderFlag,signal.SIGINT) checkProces.handle(r,conn,-1,1) elif MainLoaderFlag ==0 and laserFlag ==0: logging.info("** all Process MainLoaderFlag laser to Run...") os.kill(MainLoaderFlag,signal.SIGINT) if JavaPortFlag > 0: os.kill(JavaPortFlag,signal.SIGINT) checkProces.handle(r,conn,-1,1) elif laserFlag > 1 and MainLoaderFlag == 0 and step ==1 : logging.info("** only Process laser to Run...") checkProces.handle(r,conn,-1,1) elif laserFlag == 0 and MainLoaderFlag > 1: logging.info("** only Process MainLoaderFlag to Run...") os.kill(MainLoaderFlag,signal.SIGINT) os.kill(JavaPortFlag,signal.SIGINT) checkProces.handle(r,conn,3,5) else: win32serviceutil.StopService("checkLaserProcess") logging.info("**not build %s",flag) except KeyboardInterrupt as e: print("检测到CTRL+C,准备退出程序!") class PySer(win32serviceutil.ServiceFramework): _svc_name_ = "checkLaserProcess" _svc_display_name_ = "checkLaserProcess"#服务显示的名称,可以自己修改 _svc_description_ = "service checkLaserProcess" #服务显示的描述 def __init__(self, args): win32serviceutil.ServiceFramework.__init__(self, args) self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) self.run = True def SvcDoRun(self): checkProces.execute() def SvcStop(self): self.logger.info("service is stop....") self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) win32event.SetEvent(self.hWaitStop) self.ReportServiceStatus(win32service.SERVICE_STOPPED) self.run = False if __name__=='__main__': # win32serviceutil.HandleCommandLine(PythonService) import sys import servicemanager if len(sys.argv) == 1: try: evtsrc_dll = os.path.abspath(servicemanager.__file__) servicemanager.PrepareToHostSingle(PySer) #如果修改过名字,名字要统一 servicemanager.Initialize('checkLaserProcess',evtsrc_dll) #如果修改过名字,名字要统一 servicemanager.StartServiceCtrlDispatcher() except win32service.error as details: import winerror if details == winerror.ERROR_FAILED_SERVICE_CONTROLLER_CONNECT: win32serviceutil.usage() else: win32serviceutil.HandleCommandLine(PySer) #如果修改过名字,名字要统一```