Можно ли форматировать вывод ps RSS (память), чтобы сделать его более удобным для человека?

Проведение ps ux возвращает хороший список информации о процессе, легко grep через или watch, Тем не менее, кажется, что нет большой гибкости в выводе использования памяти; RSS (размер резидентного набора) печатается в килобайтах, что для больших процессов трудно читать (особенно с первого взгляда), и %MEM дает 100 × RSS / system_memory,

du Утилита имеет прекрасный -h флаг, который печатает пространство более удобным для пользователя способом. Я не смог найти ничего эквивалентного для ps, Есть ли специальный трюк форматирования, который может сделать это?

4 ответа

Решение
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

Кажется, что нет соответствующего флага в psтак что нужно либо использовать другой инструмент (лично я предпочитаю htop) или возиться с ps выход немного. Я думаю, вы хотите придерживаться ps, Вот маленький грязный скрипт, который я сделал в качестве примера:

# 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 | /path/to/prettyps.sh

Использование этого сценария имеет недостаток добавления дополнительных процессов в вывод ps, но, тем не менее, он работает:

$ ps ux |./prettyps.sh
USER PID% CPU% MEM VSZ (МБ)  RSS(МБ) КОМАНДА ВРЕМЕНИ ЗАПУСКА СТАТИСТИКИ
Поно 2658  0,0 0,0   358,88   4,29?      Sl    02:33  0:00   /usr/bin/gnome-keyring
... вывод усечен...
поно 4507  0,0 0,0   19,14 1,81 балла / 1 с +    03:29  0:00 человек                   
Поно 4518  0,0 0,0 10,55 0,96 баллов /1  S+    03:29  0:00 пейджер                 
Поно 4727  0,7 0,9   1143,59  53,08?      Ssl   04:10  0:24   /opt/sublime_text/subl
Поно 4742  0,1 0,4   339,05 25,80?      Sl    04:10  0:03   /opt/sublime_text/plug
Поно 5177  0,0 0,0   19,23 1,32 балла /0  R+    05:05  0:00 пс                    
pono  5178  0,0 0,0 4,34 0,61 балла /0  S+    05:05  0:00   /bin/sh 

Надеюсь, это поможет найти способ, который подходит вам.

Реквизит @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'

Еще одно решение — использоватьAWK. Например,

      ps hax -o rss,user | awk '{a[$2]+=$1;}END{for(i in a)print i" "int(a[i]/1024+0.5);}'
Другие вопросы по тегам