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