monitor_server.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. # coding:utf-8
  2. import json
  3. import os
  4. import time
  5. from mon import WorkerNodes
  6. from loguru import logger
  7. from multiprocessing import Process
  8. import psutil
  9. ServerMonitor = {}
  10. def add_server(config_path):
  11. """
  12. 添加服务器
  13. :return:
  14. """
  15. try:
  16. worker = WorkerNodes(config_path)
  17. worker.start()
  18. return None
  19. except Exception as e:
  20. logger.warning(f"{config_path}::启动失败", e)
  21. return False
  22. def config_changed(config_dir):
  23. """
  24. 检查配置文件的变动
  25. """
  26. for file in os.listdir(config_dir):
  27. file_path = os.path.join(config_dir, file)
  28. if os.path.isfile(file_path):
  29. if file_path.endswith("_nats.json"):
  30. config_value = json.load(open(file_path, "r"))
  31. name = config_value["name"]
  32. is_run = config_value.get("is_run", True)
  33. # 关闭服务
  34. if name in ServerMonitor:
  35. if not is_run:
  36. ServerMonitor[name][0].terminate()
  37. del ServerMonitor[name]
  38. logger.warning("关闭{}服务成功".format(name))
  39. continue
  40. # 启动服务过滤关闭的服务
  41. if not is_run:
  42. continue
  43. p = Process(target=add_server, args=(file_path,))
  44. p.start()
  45. ServerMonitor[name] = (p, p.pid)
  46. def check_server():
  47. # 意外退出检查
  48. global ServerMonitor
  49. exists_pid = []
  50. for name, (_, p) in ServerMonitor.items():
  51. if not psutil.pid_exists(p):
  52. logger.warning(f"{name}::a2s监控服务意外退出,请尽快处理或重启")
  53. exists_pid.append(name)
  54. for name in exists_pid:
  55. del ServerMonitor[name]
  56. def run_server(config_dir_path):
  57. while True:
  58. config_changed(config_dir_path)
  59. time.sleep(10)
  60. check_server()
  61. time.sleep(20)
  62. if __name__ == '__main__':
  63. run_server("./docs")