正如标题所说,我正在尝试制作一个 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
输出并存储用户 cpu
、mem
和 处理
数组中的相关信息并显示。
#!/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/