MonitorPid.py 6.8 KB

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