123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- 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) #如果修改过名字,名字要统一```
|