Здравствуйте.
Мне необходимо возвратить десять отсортированных в убывающем порядке процессов, наиболее требовательных к потреблению памяти, с применением утилиты ps.
Для этого я использую следующую команду:
[console]
$ ps -eo %mem | sort -gr | head -10
12.3
6.1
5.4
4.1
3.5
3.0
2.9
2.4
1.4
<...>
%MEM
[/console]
В данном случае, заголовок вывода, содержащий имя колонки (%МЕМ), будет включен в процесс сортировки и по её завершению окажется в конце отсортированного списка, а не в начале. Это является неприемлемым.
Как решить описанную проблему?
Спасибо.
PS. Сортировка с сохранением заголовка
SamuelLinux, а если подставить заголовок? :rolleyes:
~> echo '%MEM' && ps -eo %mem|sort -rg|head -10
%MEM
1.1
0.9
0.8
0.8
0.8
0.7
0.7
0.7
0.6
0.5
Нет, мне бы хотелось использовать «нативный» заголовок ps. Ваш вариант некорректно будет отображаться при выводе нескольких колонок.
[console]
$ echo 'Process CPU Memory' && ps -eo comm,%cpu,%mem | sort -gr -k3 | head -10
Process CPU Memory
firefox-bin 2.2 10.0
compiz 1.2 6.1
<...>
[/console]
Видите, в примере заголовки колонок CPU и Memory не выровнены с содержимым.
[console]
LIST=$(mktemp /tmp/list.XXXXXX)
ps -eo comm,%cpu,%mem > $LIST
head -n 1 $LIST
tail -n +2 $LIST | sort -gr -k3 | head -n 10
rm $LIST
[/console]
bormant, это наверно самый оптимальный вариант получается. В файл и вывод вытащить потом.
i2ks,
можно ещё дублироватьв 2 неименованных потока, из одного вытаскивать заголовок, другой сортировать...
bormant, спасибо за ответ.
Чтобы не перегружать вопрос излишними деталями, я вначале не указал, что требуемая команда будет использоваться внутри команды watch, и поэтому она должна быть компактна, чтобы не грузить систему при многократном повторении.
Вот пример использования:
[console]
$ watch -t -n1 'ps -eo comm,%cpu,%mem | sort -gr -k3 | head -10'
[/console]
Ваш вариант, к сожалению, не совсем подходит в данной ситуации.
К сожалению, "ps --sort -pmem" похоже не отрабатывает сортировку по %mem, а "ps --sort -sz" не сгодится в качестве критерия сортировки (с %mem не совпадает)?
sz -- size in physical pages of the core image of the process. This includes text, data, and stack space. Device mappings are currently excluded; this is subject to change.
К слову, а чем не устраивает top, ведь именно его функциональность пытаетесь воспроизвести?
К сожалению, "ps --sort -pmem" похоже не отрабатывает сортировку по %mem...
Да, так и есть.
...а "ps --sort -sz" не сгодится в качестве критерия сортировки (с %mem не совпадает)?
Я, честно говоря, так и не понял, что определяет параметр sz. Как бы то ни было, c %mem он не совпадает.
К слову, а чем не устраивает top, ведь именно его функциональность пытаетесь воспроизвести?
top мне показался громоздким и недостаточно гибким.
Нельзя, например, изменить порядок отображения столбцов в выводе, нельзя также указывать пользовательские имена для заголовков.
В top'е вся настройка осуществляется нажатием клавиш управления в течении сеанса работы с программой и последующим сохранением параметров по нажатию специальной клавиши. При этом создается малопонятный конфигурационный файл, сложный для ручной правки. Мне же удобней задавать параметры непосредственно при запуске команды с помощью ключей, а файл с настройками программы править вручную.
Возвращаясь к теме использования ps, замечу, что сортировка посредством утилиты sort работает некорректно. Вот пример. На рисунке видно, что выделенные данные отсортированы неправильно. Очевидно, что sort при сравнении числовых величин не учитывает десятичную часть и поэтому такие величины располагаются в списке в случайной последовательности.
сортировка посредством утилиты sort работает некорректно
Какие ключи, такая и сортировка:
[console]$ echo -e "1.1\n1.2\n1.3"|sort -rn
1.3
1.2
1.1
[/console]
В сочетании с -k дробная часть, действительно, не попадает в ключ. По единственной колонке сортировка отрабатывает.
Возможно, устроит результат sort -k3 -rV
Возможно, устроит результат sort -k3 -rV
Эта команда, к сожалению, не будет корректно работать в том случае, если одна из предыдущих выведенных колонок будет содержать текстовые данные. Вот пример.
На рисунке видно, что в первом случае, где выведены данные о загрузке процессора и количестве затраченной памяти, sort отработал успешно. Во втором же случае, утилита дала сбой в силу того, что в первой колонке были выведены строчные данные.
[console]
$ echo -e "sh\t0.0\nsh\t0.0\nXorg\t7.2\nruby\t0.3\nbash\t0.3" | sort -k2 -rV
Xorg 7.2
ruby 0.3
bash 0.3
sh 0.0
sh 0.0
$ sort --version
sort (GNU coreutils) 8.11
Copyright (C) 2011 Free Software Foundation, Inc.
Лицензия GPLv3+: GNU GPL версии 3 или новее <http://gnu.org/licenses/gpl.html>
Это свободное ПО: вы можете продавать и распространять его.
Нет НИКАКИХ ГАРАНТИЙ до степени, разрешённой законом.
Авторы программы -- Mike Haertel и Paul Eggert.
$ cat /etc/*-version
Slackware 13.37.0
[/console]У меня это выглядит несколько иначе.