如何使用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
相关产品推荐
相关产品推荐

