linux - 确定 linux 系统上每个唯一的进程所有者

标签 linux bash awk process

正如标题所说,我正在尝试制作一个 bash 脚本,该脚本获取系统上每个唯一的进程所有者,并计算该用户拥有的进程总数以及该用户拥有的所有进程的内存总和。我知道 ps aux 显示我需要的所有信息,但我如何获得每个唯一所有者并将其存储在变量中以便我可以获得每个用户所需的信息?

我正在考虑使用 awk 获取第一列(用户名)并将用户名存储在 array 中。我会使用 if 语句来检查用户名是否已在数组中,如果不在,则添加它。除了我不知道如何在 bash shell 中使用数组,而且这种方法似乎不是一种有效的方法。有谁知道更有效的方法吗?

示例输出

owner
Num Procs: 2, Mem: 3100, Curr CPU: 0
Hog: 00:00:00 sshd: owner@pts/16

root
Num Procs: 71, Mem: 52644, Curr CPU: 0
Hog: 01:33:41 /usr/bin/X :0 -br -audit 0 -auth /var/lib/gdm/:0.Xauth -nolisten tcp vt7

最佳答案

下面的 gawk 脚本应该会有帮助。在这里,我将 ps -eo user,%cpu,%mem 的输出重定向到 gawk 脚本。

gawk 脚本解析 ps 输出并存储用户 cpumem处理数组中的相关信息并显示。

#!/usr/bin/gawk -f

NR > 1 {
    array[$1]["cpu"]+=$2
    array[$1]["mem"]+=$3
    array[$1]["proc"]++
}

END {
    PROCINFO["sorted_in"]="@ind_str_asc"
    for (users in array) {
        printf("User: %s\n",users)
        printf("Num Procs: %s, ", array[users]["proc"])
        printf("Mem: %s, ", array[users]["mem"])
        printf("Curr CPU: %s", array[users]["cpu"])
        print("\n")
    }
}

输出:

$ ps -eo user,%cpu,%mem|./proc.awk
User: 102
Num Procs: 1, Mem: 0, Curr CPU: 0

User: 105
Num Procs: 1, Mem: 0, Curr CPU: 0

User: avahi
Num Procs: 2, Mem: 0, Curr CPU: 0

User: colord
Num Procs: 2, Mem: 0.3, Curr CPU: 0

User: daemon
Num Procs: 1, Mem: 0, Curr CPU: 0

User: dnsmasq
Num Procs: 1, Mem: 0, Curr CPU: 0

User: root
Num Procs: 81, Mem: 0.8, Curr CPU: 1.2

User: rtkit
Num Procs: 1, Mem: 0, Curr CPU: 0

User: statd
Num Procs: 1, Mem: 0, Curr CPU: 0

User: www-data
Num Procs: 5, Mem: 0, Curr CPU: 0

注意:此程序使用特定于 gawk 的功能,默认情况下应在您的系统中可用。

关于linux - 确定 linux 系统上每个唯一的进程所有者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27138961/

相关文章:

Linux 内核非对称 key 解析器

linux - 如何使用 SLURM 获取 GPU (GRES) 分配报告

linux - 我在哪里可以找到 vim 增强的资源?

node.js - npm 警告没有存储库字段

bash - 如何让 Vim 从 shebang 行检测文件类型?

unix - 删除第一列不是数字的行

shell - 如何在awk中对模式进行if else匹配

Linux Expect SFTP + 放置文件

ZSH 和 Oh-My-Zsh 本地环境映射?

awk 提取字符串的一部分,与数字进行比较,完整输出原始行