MonitorPid.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. import subprocess
  2. import psutil,time
  3. import pymysql
  4. import redis
  5. import logging
  6. import win32serviceutil
  7. import win32service
  8. import win32event
  9. import inspect
  10. import os
  11. import signal
  12. import json
  13. import win32timezone
  14. host = '127.0.0.1'
  15. rport =16379 # redis服务端口
  16. mport =3307 # mysql服务端口
  17. class checkProces :
  18. def handle(r,conn,buildStatus,sceneStatus):
  19. flagid=r.exists('build:scene:status:id')
  20. logging.info("** flagid %s " ,flagid)
  21. if flagid :
  22. id =r.get('build:scene:status:id')
  23. id = int(id.replace('L', ''))
  24. logging.info("**build %s " ,id)
  25. r.delete('build:scene:status')
  26. r.delete('build:scene:status:id')
  27. conn.ping(reconnect=True)
  28. cur = conn.cursor()
  29. type =r.get('build:scene:type')
  30. logging.info("build_type: %s ",type)
  31. if type == '"buildObj"':
  32. 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)
  33. 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)
  34. else :
  35. export_mesh_obj = checkProces.get_export_mesh_obj_by_id(id)
  36. if export_mesh_obj is not None and export_mesh_obj==1 :
  37. 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)
  38. 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)
  39. else:
  40. 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)
  41. sql2 = "UPDATE t_scene set status={0} WHERE scene_code = (SELECT scene_num FROM t_scene_file_build WHERE id = {1} )".format(sceneStatus,id)
  42. res1 = cur.execute(sql1)
  43. res2 = cur.execute(sql2)
  44. logging.info(sql1)
  45. logging.info(sql2)
  46. logging.info(res1)
  47. logging.info(res2)
  48. conn.commit()
  49. conn.close()
  50. cur.close()
  51. logging.info('\n** checkLaserProcess stop **')
  52. win32serviceutil.StopService("checkLaserProcess")
  53. def execute() :
  54. seetingjson = os.environ.get("FDMGEA_HOME") + "\\bin\\resources\\static\\setting.json"
  55. buildCallPath = json.load(open(seetingjson, 'r', encoding="utf-8"))['buildCallPath']
  56. logging.basicConfig(filename=buildCallPath + '\\monitor.log',
  57. format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
  58. level=logging.INFO,
  59. filemode='a',
  60. datefmt='%Y-%m-%d%I:%M:%S %p')
  61. r = redis.StrictRedis(host=host, port=rport, db=0, decode_responses=True)
  62. conn = pymysql.connect(host=host, port=mport, db="laser", user="root", password="laser", charset='utf8')
  63. print("\n")
  64. logging.info('\n** Search Running Process Using List Comprehension **')
  65. # Pass the Process that needs to be checked & Check, If process run under this user.
  66. MainLoader = 'MainLoader.exe'
  67. laser = 'laser.exe'
  68. TIME = 2 # 程序状态检测间隔(单位:秒钟)
  69. file = open(buildCallPath + '\\monitor.log', 'w+').close()
  70. try:
  71. while 1:
  72. time.sleep(TIME)
  73. flag = r.exists('build:scene:status')
  74. stepflag = r.exists('build:scene:step')
  75. sceneCodeFlag=r.exists("build:scene:code")
  76. if flag and stepflag and sceneCodeFlag:
  77. pid_counter = 0
  78. MainLoaderFlag = 0
  79. laserFlag = 0
  80. JavaPortFlag = 0
  81. V4JavaPortFlag = 0
  82. sceneCode=r.get('build:scene:code')
  83. pauseFlag=r.exists("build:scene:pause:code:"+sceneCode)
  84. if pauseFlag:
  85. logging.info("** pause continue...")
  86. continue
  87. step = r.get('build:scene:step')
  88. step = int(step)
  89. for procObj in psutil.process_iter(['pid', 'ppid', 'name', 'username']):
  90. if MainLoader.lower() in procObj.name().lower():
  91. MainLoaderFlag = procObj.pid
  92. if laser.lower() in procObj.name().lower():
  93. laserFlag = procObj.ppid()
  94. if procObj.info['name'] == 'java.exe' :
  95. if "fdkk-v4" in str(procObj.cmdline()) :
  96. V4JavaPortFlag= procObj.info['pid']
  97. if "fdkk-laser" in str(procObj.cmdline()) :
  98. JavaPortFlag= procObj.info['pid']
  99. logging.info("** MainLoaderFlag = %s ,laserFlag= %s,JavaPortFlag=%s,v4JavaPort=%s", MainLoaderFlag, laserFlag, JavaPortFlag,V4JavaPortFlag)
  100. if JavaPortFlag == 0:
  101. logging.info("** only Process java to Run...")
  102. checkProces.closePid(MainLoaderFlag)
  103. logging.info("** update...")
  104. checkProces.handle(r, conn, -1, 1)
  105. elif MainLoaderFlag == 0 and laserFlag == 0:
  106. logging.info("** all Process MainLoaderFlag laser to Run...")
  107. checkProces.closePid(MainLoaderFlag)
  108. if JavaPortFlag > 0:
  109. checkProces.closePid(JavaPortFlag)
  110. checkProces.closePid(V4JavaPortFlag)
  111. logging.info("** update...")
  112. checkProces.handle(r, conn, -1, 1)
  113. # elif laserFlag > 1 and MainLoaderFlag == 0 and step ==1 :
  114. # logging.info("** only Process laser to Run...")
  115. # checkProces.handle(r,conn,-1,1)
  116. elif laserFlag == 0 and MainLoaderFlag > 1:
  117. logging.info("** only Process MainLoaderFlag to Run...")
  118. checkProces.closePid(MainLoaderFlag)
  119. checkProces.closePid(JavaPortFlag)
  120. checkProces.closePid(V4JavaPortFlag)
  121. logging.info("** update...")
  122. checkProces.handle(r, conn, -1, 1)
  123. else:
  124. win32serviceutil.StopService("checkLaserProcess")
  125. logging.info("**not build %s",flag)
  126. except KeyboardInterrupt as e:
  127. print("检测到CTRL+C,准备退出程序!")
  128. def closePid(PID):
  129. try:
  130. os.kill(PID, 9)
  131. logging.info("进程已关闭")
  132. except OSError:
  133. logging.info("进程不存在")
  134. pass
  135. def get_export_mesh_obj_by_id(id,cur):
  136. # Execute the query to select the export_mesh_obj column from t_scene based on the ID
  137. sql="select export_mesh_obj from t_scene_file_build where id={0}".format(id)
  138. cur.execute(sql)
  139. # Fetch the row from the result set
  140. row = cur.fetchone()
  141. if row is not None:
  142. export_mesh_obj = row[0]
  143. return export_mesh_obj
  144. else:
  145. return None
  146. class PySer(win32serviceutil.ServiceFramework):
  147. _svc_name_ = "checkLaserProcess"
  148. _svc_display_name_ = "checkLaserProcess"#服务显示的名称,可以自己修改
  149. _svc_description_ = "service checkLaserProcess" #服务显示的描述
  150. def __init__(self, args):
  151. win32serviceutil.ServiceFramework.__init__(self, args)
  152. self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
  153. self.run = True
  154. def SvcDoRun(self):
  155. checkProces.execute()
  156. def SvcStop(self):
  157. self.logger.info("service is stop....")
  158. self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
  159. win32event.SetEvent(self.hWaitStop)
  160. self.ReportServiceStatus(win32service.SERVICE_STOPPED)
  161. self.run = False
  162. if __name__=='__main__':
  163. # win32serviceutil.HandleCommandLine(PythonService)
  164. import sys
  165. import servicemanager
  166. if len(sys.argv) == 1:
  167. try:
  168. evtsrc_dll = os.path.abspath(servicemanager.__file__)
  169. servicemanager.PrepareToHostSingle(PySer) #如果修改过名字,名字要统一
  170. servicemanager.Initialize('checkLaserProcess',evtsrc_dll) #如果修改过名字,名字要统一
  171. servicemanager.StartServiceCtrlDispatcher()
  172. except win32service.error as details:
  173. import winerror
  174. if details == winerror.ERROR_FAILED_SERVICE_CONTROLLER_CONNECT:
  175. win32serviceutil.usage()
  176. else:
  177. win32serviceutil.HandleCommandLine(PySer) #如果修改过名字,名字要统一```