Зачем собирать вывод ps самому
Готовая форма ps aux хороша для общего взгляда, но в ней нет некоторых важных сведений, например времени работы процесса и номера родителя, а лишние столбцы мешают сравнению. Ключ -o (output format) позволяет указать, какие именно столбцы показывать и в каком порядке. Вместе с -e, который выбирает все процессы, получается основа для собственных отчётов.
Пример: ps -eo pid,ppid,etime,%cpu,%mem,rss,stat,comm. Названия столбцов перечисляются через запятую без пробелов. Заголовки в выводе печатаются по умолчанию. Чтобы задать пустой заголовок, после имени столбца ставят знак равенства: ps -p 1234 -o etime=. Если пустые заголовки заданы у всех выбранных столбцов, строка шапки не печатается, и это удобно в скриптах, когда нужно получить одно значение без шапки.
Если в системе нет такого столбца, ps сообщит об ошибке или выдаст пустую колонку. Полный список имён лежит в справке: man ps, раздел о спецификаторах формата. Он различается между Linux и macOS, поэтому не переносите длинные команды между системами, не проверив их.
Столбцы, которые стоит знать
Часть спецификаторов работает одинаково в Linux и macOS, часть относится только к одной системе.
| Столбец | Что показывает | Системы |
|---|---|---|
| pid | номер процесса | обе |
| ppid | номер родительского процесса | обе |
| etime | время с момента запуска | обе |
| lstart | дата и время запуска | обе |
| %cpu, %mem | доли процессора и памяти | обе |
| rss | занятая оперативная память, килобайты | обе |
| vsz | размер виртуальной памяти | обе |
| stat | состояние процесса | обе |
| comm | имя исполняемого файла | обе |
| cmd | команда с аргументами | Linux (в macOS нет) |
| command | команда с аргументами | macOS; в procps для Linux это, по справке, синоним cmd |
| nlwp | число потоков | Linux |
Формат etime имеет вид [[дни-]часы:]минуты:секунды: например, значение вида 2-03:15:40 читается как два дня, три часа, пятнадцать минут и сорок секунд. По нему сразу видно, что процесс давно работает или только что перезапустился, и это помогает разбираться с «внезапными» перезапусками служб.
Столбец rss удобнее, чем vsz, при оценке реального потребления памяти. Виртуальный размер включает отображения, которые физически не заняты, поэтому он часто выглядит пугающе большим.
Сортировка и дерево процессов
В Linux (procps) сортировка встроена в сам ps. Пример: ps -eo pid,ppid,%mem,rss,comm --sort=-rss | head -n 11 покажет десять крупнейших по резидентной памяти процессов плюс заголовок. Знак минус означает убывание, а без него порядок возрастающий. Можно указать несколько критериев через запятую.
В macOS ключа --sort нет. Вместо него используйте сортировку оболочкой: ps -eo pid,rss,comm | sort -k2 -n -r | head. Здесь sort сортирует по второму столбцу, то есть по rss, числами и в обратном порядке. Тот же приём работает в Linux, если вам привычнее. Подробнее о сортировке рассказывает страница про sort и uniq.
Родительские связи видны в дереве процессов. В Linux есть ps -ef --forest или ps axjf, которые рисуют отступами, кто кого запустил. В macOS этих ключей нет, но по столбцу ppid вручную можно проследить цепочку. Если у вас установлена утилита pstree, она показывает дерево нагляднее, но в macOS её нужно ставить отдельно.
Дерево помогает, когда находится «лишний» процесс: родитель сразу подсказывает, какая служба или какое приложение его запустили.
Готовые рецепты для частых вопросов
Несколько типичных запросов, переведённых в команды. Имена и номера подставляйте свои.
- Как давно работает процесс: ps -p 1234 -o etime=. Вывод короткий, и его легко использовать в скрипте.
- Когда процесс запущен: ps -p 1234 -o lstart=.
- Кто родитель процесса: ps -p 1234 -o ppid=, затем ps -p номер_родителя -o comm=.
- Какие процессы запущены пользователем: ps -U имя -o pid,etime,comm (в Linux ключ -u тоже подойдёт, а в macOS он означает другое).
- Сколько потоков у процесса в Linux: ps -p 1234 -o nlwp=.
- Все процессы с их состоянием: ps -eo pid,stat,comm, это основа для поиска зависших или зомби-процессов.
Для одноразового отчёта о нагрузке сохраните вывод в файл: ps -eo pid,ppid,etime,%cpu,%mem,rss,comm > процессы.txt. Строки можно потом фильтровать через grep и awk, как описано на отдельных страницах.
О том, почему %cpu в ps не равен мгновенной загрузке, написано на странице про ps aux. Для динамики делайте несколько снимков с интервалом, например через watch, или используйте top.
Подводные камни формата -o
Первый камень: ширина столбцов. Если имя команды длинное, а терминал узкий, вывод обрезается. Чтобы увидеть полную строку запуска, добавьте ключ w в стиле BSD (повторённый -ww снимает ограничение ширины), например ps aux -ww, или перенаправьте вывод в файл или в less.
Второй: смешение стилей. Ключи вроде -eo и aux приходят из разных традиций, и сочетать их в одной команде можно не во всех реализациях. Пользуйтесь одним стилем в одной команде.
Третий: поля, которые различаются. Столбец comm в Linux усекается до 15 символов, а cmd и command содержат аргументы, в которых могут оказаться пути, имена пользователей и параметры. Поэтому, если вы публикуете вывод на форуме, проверьте его и удалите лишнее.
Четвёртый: ps делает снимок, и список процессов меняется за время вывода. Короткоживущие процессы могут не попасть в него или исчезнуть. Для наблюдения за динамикой используйте повторные замеры.
Для дальнейшей работы с состоянием STAT перейдите на страницу о состояниях процессов, а для выбора по имени откройте страницу про pgrep.
Мини-справочник по связке ps и фильтров
Если вы часто собираете данные по процессам, полезно держать несколько готовых шаблонов.
- Крупнейшие по памяти в Linux: ps -eo pid,rss,comm --sort=-rss | head.
- То же с сортировкой оболочкой: ps -eo pid,rss,comm | sort -k2 -n -r | head.
- Время работы процесса: ps -p PID -o etime=.
- Родитель процесса: ps -p PID -o ppid=.
- Состояния всех процессов: ps -eo pid,stat,comm.
Перед использованием на другой системе проверяйте названия столбцов, потому что они бывают разными, и сверяйтесь со справкой. Так вы избежите пустых колонок и неожиданных результатов.