import subprocess 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() type =r.get('build:scene:type') logging.info("build_type: %s ",type) if type == '"buildObj"': 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 build_obj_status={0} WHERE scene_code = (SELECT scene_num FROM t_scene_file_build WHERE id = {1} )".format(buildStatus,id) else : export_mesh_obj = checkProces.get_export_mesh_obj_by_id(id) if export_mesh_obj is not None and export_mesh_obj==1 : 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} and build_obj_status={1} WHERE scene_code = (SELECT scene_num FROM t_scene_file_build WHERE id = {2} )".format(sceneStatus,buildStatus,id) else: 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(sql1) logging.info(sql2) logging.info(res1) logging.info(res2) conn.commit() conn.close() cur.close() logging.info('\n** checkLaserProcess stop **') win32serviceutil.StopService("checkLaserProcess") def execute() : seetingjson = os.environ.get("FDMGEA_HOME") + "\\bin\\resources\\static\\setting.json" 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=0, 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 = 2 # 程序状态检测间隔(单位:秒钟) 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') sceneCodeFlag=r.exists("build:scene:code") if flag and stepflag and sceneCodeFlag: pid_counter = 0 MainLoaderFlag = 0 laserFlag = 0 JavaPortFlag = 0 V4JavaPortFlag = 0 sceneCode=r.get('build:scene:code') pauseFlag=r.exists("build:scene:pause:code:"+sceneCode) if pauseFlag: logging.info("** pause continue...") continue 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() if procObj.info['name'] == 'java.exe' : if "fdkk-v4" in str(procObj.cmdline()) : V4JavaPortFlag= procObj.info['pid'] if "fdkk-laser" in str(procObj.cmdline()) : JavaPortFlag= procObj.info['pid'] logging.info("** MainLoaderFlag = %s ,laserFlag= %s,JavaPortFlag=%s,v4JavaPort=%s", MainLoaderFlag, laserFlag, JavaPortFlag,V4JavaPortFlag) if JavaPortFlag == 0: logging.info("** only Process java to Run...") checkProces.closePid(MainLoaderFlag) logging.info("** update...") checkProces.handle(r, conn, -1, 1) elif MainLoaderFlag == 0 and laserFlag == 0: logging.info("** all Process MainLoaderFlag laser to Run...") checkProces.closePid(MainLoaderFlag) if JavaPortFlag > 0: checkProces.closePid(JavaPortFlag) checkProces.closePid(V4JavaPortFlag) logging.info("** update...") 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...") checkProces.closePid(MainLoaderFlag) checkProces.closePid(JavaPortFlag) checkProces.closePid(V4JavaPortFlag) logging.info("** update...") checkProces.handle(r, conn, -1, 1) else: win32serviceutil.StopService("checkLaserProcess") logging.info("**not build %s",flag) except KeyboardInterrupt as e: print("检测到CTRL+C,准备退出程序!") def closePid(PID): try: os.kill(PID, 9) logging.info("进程已关闭") except OSError: logging.info("进程不存在") pass def get_export_mesh_obj_by_id(id,cur): # Execute the query to select the export_mesh_obj column from t_scene based on the ID sql="select export_mesh_obj from t_scene_file_build where id={0}".format(id) cur.execute(sql) # Fetch the row from the result set row = cur.fetchone() if row is not None: export_mesh_obj = row[0] return export_mesh_obj else: return None 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) #如果修改过名字,名字要统一```