如何遍历函数并将每个用户添加到字典? (使用psutils包)

时间:2018-03-22 19:53:12

标签: python list loops package

我正在使用一个名为psutils的软件包,它可以让我获得平台上用户的一些使用信息(RHEL7框)。我关心的主要是CPU和内存,它做得很好。

我能够输入用户ID,并根据文档中描述的包的函数获取内存使用情况(然后自己做一些数学运算来自定义它)。

我还可以对当前登录的所有用户进行基本循环并获取它们的列表。

我正在努力尝试将两者结合起来 - 即循环遍历所有用户,将函数应用于每个用户以获得所有内存使用。

目前,我的代码设置为一次运行1个用户 - 即我可以搜索自己(Rob)并且它会吐出我的内存。现在我试图让它遍历所有这些。

如果它有帮助,我的2个工作,非常独立的代码块:

使用PSUTILS在一次性内存中找到1个用户

(例如,我作为用户,user = rob)

var pipeline = [
    /* ... */
    {
        $lookup: {
            "from": "clients",
            "localField": "client.id",
            "foreignField": "_id",
            "as": "client"
        }
    },
    /* ... */
    {
        $project: {
            client: {
                _id: 1,
                name: 1
            }
        }
    }
];

然后我只能用

之类的东西看到我的记忆
import psutils
import os

mem = psutil.virtual_memory()

#Get all processes for the user (except this one!)
procs = [p.memory_info().rss for p in psutil.process_iter() if p.username() == user and p.pid != os.getpid()]
user_mem = sum(procs)
user_procs = len(procs)
percent_total = user_mem / mem.total * 100

我会看到(以字节为单位的大数字)

print(user_mem)

但是,这只适合我 - 我可以提供所有用户的列表并通过它运行但我不知道当时是否所有用户都已登录。

我在psutils 1XXXXXXX 中找到了一个函数,它返回当前登录的所有用户的列表。

使用PSUTILS获取所有用户的列表

如果我跑:

psutils.users()

我会得到一个列表:

psutil.users()

所以我现在遇到的问题是找出一种方法来获取所有这些用户并应用上面的代码并让每个用户获得内存使用。

然后从那里开始,我相信我能够自己找出最高,最高用户。

但是我现在非常迷失于尝试使用每个内存的值来获取所有用户的字典。

2 个答案:

答案 0 :(得分:0)

听起来你需要.map输出psutil.users()。 创建一个函数,该函数采用suser,过滤器psutil.process_iter()的方式与您现在为该用户执行的方式相同,并返回您关注的值。

ps_users = [suser(name='person2',...)]

def get_memory_for_user(user):
    procs = [p.memory_info().rss
       for p in psutil.process_iter()
       if p.username() == user.name and p.pid != os.getpid()]
    return (user.name, sum(procs), len(procs,)

users_usage = map(get_memory_for_user, ps_users)

答案 1 :(得分:0)

这可以让你走上正确的轨道,但我会创建一个字典并将用户存储在那里进行迭代。有一点需要注意,从我的系统上运行psutil.users(),我看到每个tty多次列出我的用户名。您将要查看procs是否获得了所有这些内容。

无论如何,代码应大致如下:

import psutils
import os

mem = psutil.virtual_memory()

ps_dict = {}

for u in psutil.users():
    ps_dict[u].name = None

for user in ps_dict.keys():
    #Get all processes for the user (except this one!)
    ps_dict[user] = {
        'procs':[p.memory_info().rss for p in psutil.process_iter() if p.username() == user and p.pid != os.getpid()],
        'user_mem' : sum(procs),
        'user_procs' : len(procs),
        'percent_total' : user_mem / mem.total * 100
        }