是否可以将 ps RSS(内存)输出格式化为更加人性化?

是否可以将 ps RSS(内存)输出格式化为更加人性化?

执行ps ux将返回一个不错的进程信息列表,便于grep浏览或watch。但是,内存使用量输出似乎没有太多灵活性;RSS(驻留集大小)以 kB 为单位打印,对于大型进程来说很难阅读(尤其是一目了然),并%MEM给出100 ×  RSSsystem_memory

du实用程序有一个可爱的-h标志,可以以更用户友好的方式打印空格。我找不到任何等效的东西ps。是否有特殊的格式化技巧可以实现这一点?

答案1

ps ux | numfmt --header --to=iec --field 5,6 --padding 6

您需要 coreutils >= 8.25

我个人更喜欢这个:

ps -eo pmem,comm,pid,maj_flt,min_flt,rss,vsz --sort -rss | numfmt --header --to=iec --field 4-5 | numfmt --header --from-unit=1024 --to=iec --field 6-7 | column -t | head

答案2

似乎没有合适的标志ps,所以您需要使用其他工具(我个人更喜欢)或稍微htop弄乱输出。我猜你想坚持使用。这是我编写的一个小脚本作为示例:psps

# get terminal width
WIDTH=`tput cols`
# pipe stdin to awk
cat | \
awk '\
BEGIN {
    # set output format
    CONVFMT="%.2f"
}
NR==1 {
    # search first line for columns that need to be converted from K to M
    for (i=1;i<=NF;i++) 
        # add condition for new columns if you want
        if ($i=="VSZ" || $i=="RSS") {
            # column numbers are stored in an array
            arr[i]=i; 
            $i = $i "(MB)"
        }
}
NR > 1 {
    # edit appropriate columns
    for (i in arr)
        $i=$i/1024; 
}
{
    # print every line
    print $0
}' | \
# format the output into columns and trim it to terminal width
column -t | cut -c 1-$WIDTH

将其保存到文件,例如prettyps.sh,使其可执行:

chmod +x prettyps.sh

并使用如下:

ps ux | /路径/到/prettyps.sh

使用此脚本的缺点是会向 ps 输出中添加额外的进程,但它仍然有效:

$ ps ux | ./prettyps.sh
用户 PID %CPU %MEM VSZ(MB) RSS(MB) TTY STAT 开始时间命令
pono 2658 0.0 0.0 358.88 4.29 ? Sl 02:33 0:00 /usr/bin/gnome-keyring
...输出被截断...
pono 4507 0.0 0.0 19.14 1.81 分/1 S+ 03:29 0:00 人                   
pono 4518 0.0 0.0 10.55 0.96 pts/1 S+ 03:29 0:00 传呼机                 
波诺 4727 0.7 0.9 1143.59 53.08? Ssl 04:10 0:24 /opt/sublime_text/subl
pono 4742 0.1 0.4 339.05 25.80 ? Sl 04:10 0:03 /opt/sublime_text/plug
pono 5177 0.0 0.0 19.23 1.32 pts/0 R+ 05:05 0:00 ps                    
pono 5178 0.0 0.0 4.34 0.61 pts/0 S+ 05:05 0:00 /bin/sh

希望这有助于找到适合您的方法。

答案3

感谢@adrianlxt!这是我的新别名“pss”:

ps -eo pid,pmem,rss,vsz,comm,command --sort -rss | numfmt --header --from-unit=1024 --to=iec --field 3-4 | awk '$3 != 0'

答案4

另一个解决方案是使用AWK。例如,

ps hax -o rss,user | awk '{a[$2]+=$1;}END{for(i in a)print i" "int(a[i]/1024+0.5);}'

相关内容