MonitorPid.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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. if flag :
  60. pid_counter = 0
  61. MainLoaderFlag=0
  62. laserFlag=0
  63. JavaPortFlag =0
  64. for procObj in psutil.process_iter(['pid','ppid', 'name', 'username']):
  65. if MainLoader.lower() in procObj.name().lower():
  66. MainLoaderFlag=procObj.pid
  67. if laser.lower() in procObj.name().lower():
  68. laserFlag=procObj.ppid()
  69. netConnections= psutil.net_connections()
  70. for con in netConnections :
  71. if con.raddr != tuple():
  72. if con.raddr.port == javaPort and psutil.Process(con.pid).name() == 'java.exe':
  73. JavaPortFlag=con.pid
  74. break
  75. if con.laddr != tuple():
  76. if con.laddr.port == javaPort and psutil.Process(con.pid).name() == 'java.exe':
  77. JavaPortFlag=con.pid
  78. break
  79. logging.info("** MainLoaderFlag = %s ,laserFlag= %s,JavaPortFlag=%s",MainLoaderFlag,laserFlag,JavaPortFlag)
  80. if JavaPortFlag==0:
  81. logging.info("** only Process java to Run...")
  82. os.kill(MainLoaderFlag,signal.SIGINT)
  83. checkProces.handle(r,conn,-1,1)
  84. elif MainLoaderFlag ==0 and laserFlag ==0:
  85. logging.info("** all Process MainLoaderFlag laser to Run...")
  86. os.kill(MainLoaderFlag,signal.SIGINT)
  87. if JavaPortFlag > 0:
  88. os.kill(JavaPortFlag,signal.SIGINT)
  89. checkProces.handle(r,conn,-1,1)
  90. elif laserFlag > 1 and MainLoaderFlag == 0:
  91. logging.info("** only Process laser to Run...")
  92. checkProces.handle(r,conn,-1,1)
  93. elif laserFlag == 0 and MainLoaderFlag > 1:
  94. logging.info("** only Process MainLoaderFlag to Run...")
  95. os.kill(MainLoaderFlag,signal.SIGINT)
  96. os.kill(JavaPortFlag,signal.SIGINT)
  97. checkProces.handle(r,conn,3,5)
  98. else:
  99. win32serviceutil.StopService("checkLaserProcess")
  100. logging.info("**not build %s",flag)
  101. except KeyboardInterrupt as e:
  102. print("检测到CTRL+C,准备退出程序!")
  103. class PySer(win32serviceutil.ServiceFramework):
  104. _svc_name_ = "checkLaserProcess"
  105. _svc_display_name_ = "checkLaserProcess"#服务显示的名称,可以自己修改
  106. _svc_description_ = "service checkLaserProcess" #服务显示的描述
  107. def __init__(self, args):
  108. win32serviceutil.ServiceFramework.__init__(self, args)
  109. self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
  110. self.run = True
  111. def SvcDoRun(self):
  112. checkProces.execute()
  113. def SvcStop(self):
  114. self.logger.info("service is stop....")
  115. self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
  116. win32event.SetEvent(self.hWaitStop)
  117. self.ReportServiceStatus(win32service.SERVICE_STOPPED)
  118. self.run = False
  119. if __name__=='__main__':
  120. # win32serviceutil.HandleCommandLine(PythonService)
  121. import sys
  122. import servicemanager
  123. if len(sys.argv) == 1:
  124. try:
  125. evtsrc_dll = os.path.abspath(servicemanager.__file__)
  126. servicemanager.PrepareToHostSingle(PySer) #如果修改过名字,名字要统一
  127. servicemanager.Initialize('checkLaserProcess',evtsrc_dll) #如果修改过名字,名字要统一
  128. servicemanager.StartServiceCtrlDispatcher()
  129. except win32service.error as details:
  130. import winerror
  131. if details == winerror.ERROR_FAILED_SERVICE_CONTROLLER_CONNECT:
  132. win32serviceutil.usage()
  133. else:
  134. win32serviceutil.HandleCommandLine(PySer) #如果修改过名字,名字要统一```