cpu_memory.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. # -*- coding: utf-8 -*-
  2. # @Author: wangkun
  3. # @Time: 2023/7/20
  4. import json
  5. import os
  6. import socket
  7. import sys
  8. import psutil
  9. sys.path.append(os.getcwd())
  10. from common.common import Common
  11. from common.scheduling_db import MysqlHelper
  12. class MonitorCpuMemory:
  13. @classmethod
  14. def get_script_list(cls, log_type, crawler, env):
  15. script_list = []
  16. select_sql = f""" SELECT DISTINCT `key` FROM crawler_enum WHERE `key` LIKE "%run%"; """
  17. sql_response = MysqlHelper.get_values(log_type, crawler, select_sql, env, action="")
  18. for response in sql_response:
  19. script_list.append(response["key"])
  20. script_list.append("run_cpu_memory")
  21. return script_list
  22. @classmethod
  23. def get_ip_address(cls):
  24. try:
  25. # 创建一个 UDP 套接字
  26. sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  27. # 连接到一个外部 IP 地址
  28. sock.connect(("8.8.8.8", 80))
  29. # 获取本地 IP 地址
  30. local_ip = sock.getsockname()[0]
  31. return local_ip
  32. except socket.error:
  33. return None
  34. @classmethod
  35. def get_pid_path(cls, script_name):
  36. # 遍历所有正在运行的进程
  37. for proc in psutil.process_iter():
  38. try:
  39. # 获取进程的命令行参数
  40. cmds = proc.cmdline()
  41. # 检查命令行参数是否包含爬虫脚本的名称或关键字
  42. for cmd in cmds:
  43. if script_name in cmd:
  44. # Common.logger(log_type, crawler).info(f"cmd:{cmd}")
  45. # 获取进程的PID
  46. pid = proc.pid
  47. pid_path = {
  48. "pid": pid,
  49. "path": cmd,
  50. }
  51. return pid_path
  52. except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
  53. pass
  54. @classmethod
  55. def get_cpu_memory(cls, script_name):
  56. # 获取当前进程的PID
  57. pid_path = cls.get_pid_path(script_name)
  58. # print(f"pid_path:{pid_path}")
  59. if pid_path is None:
  60. return None
  61. # 获取CPU的使用情况
  62. cpu_percent = round(psutil.Process(pid_path["pid"]).cpu_percent(), 2)
  63. # 获取内存的使用情况
  64. memory_percent = round(psutil.Process(pid_path["pid"]).memory_percent(), 2)
  65. cpu_memory = {
  66. "pid": pid_path["pid"],
  67. "path": pid_path["path"],
  68. "cpu": cpu_percent,
  69. "memory": memory_percent,
  70. }
  71. return cpu_memory
  72. @classmethod
  73. def get_all_script_cpu_memory(cls, log_type, crawler, env):
  74. script_list = cls.get_script_list(log_type, crawler, env)
  75. for script_name in script_list:
  76. try:
  77. Common.logger(log_type, crawler).info(f"开始监控:{script_name}")
  78. Common.logging(log_type, crawler, env, f"开始监控:{script_name}")
  79. crawler_info = cls.get_cpu_memory(script_name)
  80. if crawler_info is None:
  81. Common.logger(log_type, crawler).info(f"脚本未运行\n")
  82. Common.logging(log_type, crawler, env, f"脚本未运行\n")
  83. continue
  84. script_info_dict = json.dumps({
  85. "crawler_name": script_name,
  86. "crawler_ip": cls.get_ip_address(),
  87. "crawler_pid": crawler_info["pid"],
  88. "crawler_path": crawler_info["path"],
  89. "crawler_cpu": crawler_info["cpu"],
  90. "crawler_memory": crawler_info["memory"]
  91. })
  92. Common.logger(log_type, crawler).info(f'script_info:{script_info_dict}\n')
  93. Common.logging(log_type, crawler, env, f'{script_info_dict}')
  94. except Exception as e:
  95. Common.logger(log_type, crawler).error(f"监控{script_name}时异常:{e}\n")
  96. Common.logging(log_type, crawler, env, f"监控{script_name}时异常:{e}\n")
  97. if __name__ == "__main__":
  98. ipaddress = MonitorCpuMemory.get_ip_address()
  99. print(ipaddress)
  100. pass