#!/bin/sh
OLDIFS=$IFS
IFS=$'\n'
tempsum=0
totalmem=0
for m in `ps -eo user,rss --sort user | sed -e 's/ */ /g' | awk -F'[ ]' {'print $0'}`; do
nu=`echo $m|cut -d" " -f1`
nm=`echo $m|cut -d" " -f2`
# echo "$nu $nm $nu"
if [ "$nu" != "$ou" ] && [ $(echo "$nm"|grep -E "^[0-9]+$") ]
then
if [ "$tempsum" -ne 0 ]; then echo "Printing total mem for $ou: $tempsum"; fi
ou=$nu
tempsum=$nm
let "totalmem += $nm"
else
let "tempsum += $nm"
let "totalmem += $nm"
fi
done
echo "Total Memory in Use: $totalmem/$(free | grep Mem: | awk '{print $2}')"
IFS=$OLDIFS
结果:
[20:34][root@server2:~]$ ./memorybyuser.sh
Printing total mem for admin: 1387288
Printing total mem for apache: 227792
Printing total mem for avahi: 1788
Printing total mem for dbus: 980
Printing total mem for 68: 3892
Printing total mem for root: 55880
Printing total mem for rpc: 292
Printing total mem for rpcuser: 740
Printing total mem for smmsp: 720
Printing total mem for xfs: 680
Total Memory in Use: 1682360/4152144
您可以尝试使用smem(有关更多信息,请参阅ELC2009:使用 smem 可视化内存使用情况)。特别是
sudo smem -u
应该给你你想要的信息。忽略共享内存问题,这里有一个快速脚本,它为所有登录用户提供 RSS 和 VMEM,按 vmem 排序,并组织成可爱的列:
为了得到 RSS 的总和,我认为以下工作。这将获得用户 kbrandt 和 root 的 RSS 总和。
寻找相同的,我想通了
要打印按 mem 排序的进程,按用户分组(列 1,$1),您可以按其他事物分组,并对其他事物求和,更改 $1 和 $4
我很高兴找到解决方案,只是想分享。
这是一个棘手的问题。您可以轻松地总结“ps”输出中的总 RSS+swap 数量,但是共享内存呢?如果他们运行相同的进程,不同的用户可以轻松地共享相同的代码页。你把这算给谁?缓冲区和缓存呢?这实际上取决于您希望结果的准确性。你想要的越准确,就越难。
我不确定如何报告用户的内存使用情况,但如果您担心控制他们的使用情况,那么您应该查找 ulimit。它将允许您基于每个用户/组为系统上的内存和其他资源设置硬限制和软限制。
您可以尝试以下方法:
这个 bash 脚本可能很难看,但是感谢您的练习,我的 bash 已经(正在)生锈了!
结果:
请评论/更正,我会更新答案。我也使用 PS 的 rss 内存输出,正如其他人所讨论的那样,使用这个值有优缺点。
smem 在我的系统上不可用,并且 Dave 的脚本由于某种原因无法工作,所以我编写了这个丑陋的 Perl oneliner 来处理 ps 输出:
请注意,某些用户是使用他们的 UID 而不是他们的用户名来识别的。您可以通过使用 uglier 解析 /etc/passwd 中的用户名来解决这个问题:
使用 Bash 脚本
输出