获取PID、CPU、内存使用率使用了psutil库,Git地址:https://github.com/giampaolo/psutil

直接上代码

主体代码

#-*- encoding:UTF-8 -*-
import json
import os
import time
import socket
import psutil
import config
import threading


class Statues():
    def __init__(self):
        self.dir_name = config.folder_name

    def get_pid(self, name):
        """
        获取指定进程的PID、内存、CPU、子进程PID、内存、CPU信息
        :param name: 进程名
        :return:
        """
        pids = psutil.pids()

        result_dict = dict()
        for pid in pids:
            try:
                p = psutil.Process(pid)
            except Exception:
                continue

            if p.name() == name:

                try:
                    cpu = psutil.Process(p.pid)
                except Exception:
                    continue
                cpu = cpu.cpu_percent(interval=1)
                childrens = psutil.Process(p.pid).children()
                # 获取占用内存百分比
                mem = psutil.Process(p.pid).memory_percent(memtype="rss")
                mem = round(mem, 2)
                # 获取总内存
                total_mem = psutil.virtual_memory().total
                total_mem = total_mem / 1024 / 1024
                memory = total_mem * mem / 100

                ch_list = list()
                for ch in childrens:
                    # print ch
                    ch_dict = dict()
                    ch_mem = psutil.Process(ch.pid).memory_percent(memtype="rss")
                    ch_mem = round(ch_mem, 2)
                    ch_memory = total_mem * ch_mem / 100
                    # 一个主进程会存在对个子进程,将这些子进程放进列表中
                    ch_dict["children_name"] = ch.name()
                    ch_dict["children_pid"] = ch.pid
                    ch_dict["ch_memory"] = round(ch_memory, 2)
                    ch_list.append(ch_dict)

                # 如果一个主进程没有子进程,那么子进程列表为空
                result_dict[name + "_" + str(p.pid)] = {
                    "ProcessName": p.name(),
                    "PID": p.pid,
                    "CPU": cpu,
                    "memory": round(memory, 2),
                    "ch_list": ch_list,
                }
        return result_dict

    def get_local_name_IP(self):
        """
        获取本地名, 获取本地IP地址
        :return:
        """
        # 获取本机电脑名
        myname = socket.gethostname()
        # 获取本机ip
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(('8.8.8.8', 80))
        myaddr = s.getsockname()[0]
        return myname, myaddr

    def get_edit_time(self, files):
        """
        获取文件修改时间
        :param files: 文件列表
        :return:
        """
        file_dir = self.get_dirpath(self.dir_name)
        file_edit_time = dict()
        for file in files:
            full_path = os.path.join(file_dir, file)

            mtime = os.stat(full_path).st_mtime
            file_modify_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(mtime))
            file_edit_time[file] = file_modify_time
        return file_edit_time

    def get_dirpath(self, folder_name):
        """
        获取文件夹路径
        :param folder_name: 文件夹名称
        :return: 文件夹路径
        """
        cur_path = os.path.dirname(os.path.realpath(folder_name))
        dir_path = os.path.join(cur_path, folder_name)
        return dir_path

    def get_file_list(self):
        """
        获取文件列表
        :return:
        """
        file_dir = self.get_dirpath(self.dir_name)
        # 获取指定目录下的所有子目录和文件名列表
        dir_tupple = os.walk(file_dir)

        files_list = list()
        for path, dirs, files in dir_tupple:
            files_list = files

        return files_list

    def conn_redis(self):
        import redis
        redis_host = config.redis_host
        redis_port = config.redis_port
        conn = redis.Redis(redis_host, redis_port, decode_responses=True)

        if conn:
            return conn

    def return_data(self):
        # status = Statues()

        file_list = self.get_file_list()  # 获取文件列表
        edit_time = self.get_edit_time(file_list)  # 获取最后编辑时间
        name, IP = self.get_local_name_IP()  # 获取计算机名和IP地址(元组)
        process_name_list = config.process_name_list

        process_info_dict = dict()
        for process_name in process_name_list:
            result_dict = self.get_pid(process_name)
            dict_items = result_dict.items()

            for key, values in dict_items:
                process_info_dict[key] = values

        # 暂时移除日志文件最后一次修改时间的处理
        # process_info_dict["log_edit_time"] = edit_time

        process_info_dict = json.dumps(process_info_dict)

        filed = name + "_" + IP

        con_redis = self.conn_redis()
        redis_key = config.redis_key
        con_redis.hset(redis_key, filed, process_info_dict)

        runing_time = config.runing_time
        timer = threading.Timer(runing_time, self.return_data)
        timer.start()


if __name__ == '__main__':
    status = Statues()
    # 第一次运行
    timer = threading.Timer(1, status.return_data)
    timer.start()

代码中使用了线程的定时执行的方法,将采集到的数据转成json后通过hash的方式存入Redis内

config.py


#-*- encoding:UTF-8 -*-
# 文件夹名称
folder_name = "Test"

# redis配置
redis_host = "192.168.*.*"
redis_port = 6379

# 需要监控的进程列表
process_name_list = [
    # "Postman.exe",
    # "python.exe",
    "QQBrowser.exe",
    # "WeChat.exe"
]

# 定时启动时间
runing_time = 60

# redis的key
redis_key = "*****"
打赏

发表评论

邮箱地址不会被公开。 必填项已用*标注