monitor_server.py 2.4 KB

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