You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用psutils循环遍历用户并将其CPU、内存信息存入字典?

嘿,我刚好在RHEL7上用psutil做过类似的用户资源统计需求,给你捋捋怎么把这两部分功能串起来~

核心思路拆解

其实就是先拿到登录用户的唯一ID列表,然后遍历每个ID调用你已经写好的内存统计函数,最后把结果规整到字典里就行,逻辑很清晰,咱们一步步来:

1. 先获取登录用户的唯一UID列表

psutil的psutil.users()会返回当前所有登录会话的用户对象,里面包含uid字段。但要注意,同一个用户可能开了多个会话(比如ssh登录多次),所以要先去重:

import psutil

# 获取所有登录用户的UID
logged_in_uids = [user.uid for user in psutil.users()]
# 去重,避免重复统计同一个用户
unique_uids = list(set(logged_in_uids))

2. 遍历UID,调用你的统计函数并存入字典

假设你已经有了一个get_user_memory(uid)函数来计算单个用户的内存使用量,咱们直接循环遍历每个UID,把结果塞进字典里。如果需要同时统计CPU,也可以加个对应的函数:

# 初始化存储结果的字典,key可以用UID或者用户名,看你需求
user_resource_stats = {}

for uid in unique_uids:
    # 调用你已经实现的内存统计函数
    memory_usage = get_user_memory(uid)
    # 同理,调用CPU统计函数(如果还没写,后面给你参考实现)
    cpu_usage = get_user_cpu(uid)
    
    # 把数据存入字典,这里用UID当key更准确,也可以转成用户名
    user_resource_stats[uid] = {
        "memory_usage_mb": memory_usage,
        "cpu_usage_percent": cpu_usage
    }

3. (可选)把UID转成用户名,让字典更直观

如果觉得UID不够友好,可以用pwd模块把UID转成对应的用户名,避免出现看不懂的ID:

import pwd

def uid_to_username(uid):
    try:
        return pwd.getpwuid(uid).pw_name
    except KeyError:
        # 处理不存在的UID(比如系统临时进程的UID)
        return f"unknown_uid_{uid}"

# 调整循环,用用户名当key
for uid in unique_uids:
    username = uid_to_username(uid)
    memory_usage = get_user_memory(uid)
    cpu_usage = get_user_cpu(uid)
    
    user_resource_stats[username] = {
        "uid": uid,
        "memory_usage_mb": memory_usage,
        "cpu_usage_percent": cpu_usage
    }

4. 补充:单个用户CPU/内存统计函数的参考实现

如果你还没写CPU的统计函数,这里给你个参考,和你的内存函数逻辑一致:

def get_user_memory(uid):
    total_memory = 0.0
    # 遍历所有进程,过滤出当前UID的进程
    for proc in psutil.process_iter(['pid', 'uid', 'memory_info']):
        try:
            if proc.info['uid'] == uid:
                # 把字节转成MB,rss是常驻内存,vms是虚拟内存,按需选择
                total_memory += proc.info['memory_info'].rss / (1024 * 1024)
        except (psutil.NoSuchProcess, psutil.AccessDenied):
            # 跳过已结束的进程或无权限访问的进程
            continue
    return round(total_memory, 2)

def get_user_cpu(uid):
    total_cpu = 0.0
    for proc in psutil.process_iter(['pid', 'uid', 'cpu_percent']):
        try:
            if proc.info['uid'] == uid:
                # 累加该用户所有进程的CPU使用率
                total_cpu += proc.info['cpu_percent']
        except (psutil.NoSuchProcess, psutil.AccessDenied):
            continue
    return round(total_cpu, 2)

最后验证一下

运行完之后,打印user_resource_stats就能看到每个用户的CPU和内存数据了,格式大概是这样:

print(user_resource_stats)
# 输出示例:
# {'root': {'uid': 0, 'memory_usage_mb': 123.45, 'cpu_usage_percent': 5.2}, 'robromo': {'uid': 1000, 'memory_usage_mb': 67.89, 'cpu_usage_percent': 1.1}}

内容的提问来源于stack exchange,提问作者robromo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:33:30