假设我有20个用户登录到我的Linux机器上。我怎么知道他们每个人使用多少内存?
假设我有20个用户登录到我的Linux机器上。我怎么知道他们每个人使用多少内存?
Answers:
--no-install-recommends
。
忽略共享内存问题,以下是一个快速脚本,该脚本为您提供了所有登录用户的RSS和VMEM,按vmem排序并组织为可爱的列:
(echo "user rss(KiB) vmem(KiB)";
for user in $(users | tr ' ' '\n' | sort -u); do
echo $user $(ps -U $user --no-headers -o rss,vsz \
| awk '{rss+=$1; vmem+=$2} END{print rss" "vmem}')
done | sort -k3
) | column -t
为了获得RSS的总和,我认为以下工作有效。这将是为用户kbrandt和root获得RSS的总和。
ps -U kbrandt,root --no-headers -o rss | (tr '\n' +; echo 0) | bc
您可以尝试以下方法:
ps auxU maxwell | awk'{内存+ = $ 4}; END {打印内存}'
ps aux | grep mysql | awk '{memory +=$4}; END {print memory }'
,将mysql替换为用户或进程的名称。
寻找相同,我想通了
ps aux | awk '{arr[$1]+=$4}; END {for (i in arr) {print i,arr[i]}}' | sort -k2
要打印按内存顺序排序,按用户分组(列1,$ 1)的进程,您可以按其他内容分组,并对其他内容求和,更改$ 1和$ 4
我很高兴找到解决方案,只想分享。
ps --no-headers -eo user,rss | awk '{arr[$1]+=$2}; END {for (i in arr) {print i,arr[i]}}' | sort -nk2
。sort命令需要该-n
标志以使其将内存解析为数字。同样,您也可以用“命令”替换“用户”一词,以按应用程序名称分组。
这个bash脚本可能像地狱一样丑陋,但是感谢您的练习,我的bash变得生锈了!
#!/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
请评论/纠正,我将更新答案。我也使用PS的rss内存输出,因为其他人已经讨论过使用此值有其优点/缺点。
smem在我的系统上不可用,并且Dave的脚本由于某种原因无法正常工作,因此我编写了这个难看的Perl oneliner来处理ps输出:
ps -eo user,rss | perl -e 'foreach (<>) { m/(\w+)\s+(\d+)/; $mem{$1} += $2; }; foreach $u (keys %mem) { if ($mem{$u}) { print "$u - $mem{$u}\n" }}' | sort
请注意,某些用户是使用其UID而非用户名来标识的。您可以使用较丑陋的方法从/ etc / passwd解析用户名来解决此问题:
ps -eo user,rss | perl -e 'open(F, "/etc/passwd"); foreach $l (<F>) { if ($l=~/(.*?):.*?:(\d+)/) { $users{$2}=$1; }}; foreach (<>) { m/(\w+)\s+(\d+)/; $mem{$1} += $2; }; foreach $u (keys (%mem)) { $UN = $u; if ($UN=~/^\d+$/) { $UN = $users{$UN};}; if ($mem{$u}) { print "$UN - $mem{$u}\n" }}' | sort
使用Bash脚本
#!/bin/bash
total_mem=0
printf "%-10s%-10s\n" User MemUsage'(%)'
while read u m
do
[[ $old_user != $u ]] && { printf "%-10s%-0.1f\n" $old_user $total_mem;
total_mem=0; }
total_mem="$(echo $m + $total_mem | bc)"
old_user=$u
done < <(ps --no-headers -eo user,%mem| sort -k1)
#EOF
输出值
User MemUsage(%)
apache 4.8
dbus 0.0
mysql 3.8
nagios 3.1