Bash - 内存使用情况

42 浏览
0 Comments

Bash - 内存使用情况

我有一个问题解决不了,所以我来找你了。

我需要写一个程序,能够读取所有进程,并对其按用户进行排序,对于每个用户,程序必须显示使用了多少内存。

例如:

用户1:120MB

用户2:300MB

用户3:50MB

总计:470MB

我想用 ps aux 命令来完成这个任务,然后用 awk 命令获取 pid 和用户,最后用 pmap 获取进程的总内存使用情况。

admin 更改状态以发布 2023年5月23日
0
0 Comments

尝试使用这个脚本,可能解决您的问题:\n\n

#!/bin/bash
function mem_per_user {
    # take username as only parameter
    local user=$1
    # get all pid's of a specific user
    # you may elaborate the if statement in awk obey your own rules
    pids=`ps aux | awk -v username=$user '{if ($1 == username) {print $2}}'`
    local totalmem=0
    for pid in $pids
    do
        mem=`pmap $pid | tail -1 | \
            awk '{pos = match($2, /([0-9]*)K/, mem); if (pos > 0) print mem[1]}'`
        # when variable properly set
        if [ ! -z $mem ]
        then
            totalmem=$(( totalmem + $mem))
        fi
    done
    echo $totalmem
}
total_mem=0
for i in `seq 1 $#`
do
    per_user_memory=0
    eval username=\$$i
    per_user_memory=$(mem_per_user $username)
    total_mem=$(( $total_mem + $per_user_memory))
    echo "$username: $per_user_memory KB"
done
echo "Total: $total_mem KB"

\n\n最好的问候!

0
0 Comments

这只是一个小更新,用户会自动选择

#!/bin/bash
function mem_per_user {
    # take username as only parameter
    local user=$1
    # get all pid's of a specific user
    # you may elaborate the if statement in awk obey your own rules
    pids=`ps aux | awk -v username=$user '{if ($1 == username) {print $2}}'`
    local totalmem=0
    for pid in $pids
    do
        mem=`pmap $pid | tail -1 | \
            awk '{pos = match($2, /([0-9]*)K/, mem); if (pos > 0) print mem[1]}'`
        # when variable properly set
        if [ ! -z $mem ]
        then
            totalmem=$(( totalmem + $mem))
        fi
    done
    echo $totalmem
}
total_mem=0
for username in `ps aux | awk '{ print $1 }' | tail -n +2 | sort | uniq`
do
    per_user_memory=0
    per_user_memory=$(mem_per_user $username)
    if [ "$per_user_memory" -gt 0 ]
    then
       total_mem=$(( $total_mem + $per_user_memory))
       echo "$username: $per_user_memory KB"
    fi
done
echo "Total: $total_mem KB"

0