正如标题所说,我试图创建一个bash脚本,该脚本获取系统中每个唯一进程所有者,并计算该用户拥有的进程总数以及该用户拥有的所有进程的内存总和。我知道ps aux
显示了我需要的所有信息,但是如何获得每个唯一所有者并将其存储在变量中以便我可以获得每个用户所需的信息?
我正在考虑使用awk
获取第1列(用户名)并将用户名存储在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
答案 0 :(得分:1)
如果你坚持用bash完全做到这一点,它会变得非常尴尬,最终结果将难以阅读。虽然你可以用bash编写相当复杂的脚本,但bash实际上是用来编写脚本来自动执行简单,重复的任务。 bash真的不适合进行复杂的计算,就像那样。
但是,如果你坚持使用bash:
ls -ald /proc/[0-9]* | awk ' { print $3 } ' | sort | uniq -c
这可以计算每个用户名当前运行的系统进程数。
for f in /proc/[0-9]*/stat; do echo `ls -l $f | awk ' { print $3 } '` `awk ' { print $24 * 4096 } ' <$f`; done | perl -e 'while(<STDIN>) { my @w=split; $n{$w[0]} += $w[1]; } print join("", map { "$_=$n{$_}\n"; } sort keys %n);'
这给出了每个进程使用的RAM的总字节数。它从/ proc / stat读取RSS列,它给出了每个进程使用的页面数,我相信在大多数常见的Linux平台上每个页面都是4096字节(如果需要,可以针对您的特定平台进行调整)。使用VSZ(虚拟进程大小)会产生误导。
但正如我刚才提到的,在我看来,bash并不是真正适合这种hackery的工具。我想,在Perl中做所有事情可能会更好。最后,我最终无法避免使用一些Perl hackery来添加所有东西。等效的bash代码会更长,更复杂。
答案 1 :(得分:1)
以下gawk
脚本应该会有所帮助。在这里,我将ps -eo user,%cpu,%mem
的输出重定向到gawk
脚本。
gawk
脚本解析ps
输出,并将用户cpu
,mem
和process
相关信息存储在数组中并显示它们。< / p>
#!/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
的功能,默认情况下应在系统中提供。