Как работает команда ps
Команда ps выводит список текущих процессов на вашем сервере в виде таблицы, с которой можно удобно работать: сортировать, изменять количество колонок и прочие. У утилиты ps множество настроек, с помощью которых можно тонко настраивать вывод команды, также никто не запрещает вам делать конвейеры, чтобы отсечь всё лишнее.
Например, можно вывести только первые строчки или наоборот последнее строчки, также можно сортировать строчки и искать вхождения:
ps -A | head -5 # выведет первые 5 строчек отчёт, включая заголовок таблицы
ps -A | tail -5 # выведет последние 5 строчек отчёт
ps -A | grep "sys" #выведет все процессы с вхождениями sys
Важно понимать, что команда ps в Linux выводит статический отчёт, её не получится использовать для непрерывного мониторинга состояния процессов, а вот top и htop — другое дело, они показывают реальную динамику по процессам.
Суть работы команды ps в том, что она собирает данные из специальной директории /etc/proc, в которой находятся сведения о процессах и представляет их в удобной форме для восприятия. С работой команды ps в Linux всё просто, а вот разобраться в том, что такое процесс в Linux совсем непросто.
Что такое процесс в Linux
Процесс Linux — это экземпляр программы, запущенный в собственном независимом виртуальном адресном пространстве (части памяти). Это сделано для безопасности, чтобы один процесс не мог влиять на работу другого процесса. Из этих же соображений сделана специальная директория etc/proc, чтобы процессы не могли влиять на работу ядра Linux.
Процессов может быть запущено огромное количество, в том числе по несколько экземпляров от имени одного и того же пользователя, чтобы ядро Linux могло различать эти процессы, существую идентификаторы процессов — PIDs (Process Identificator Number).
Так как процесс — это экземпляр программы, то для его запуска требуются ресурсы и процессорное время, поэтому процесс может находиться в разных состояниях:
- Ожидание — процесс ожидает сигнала для запуска или выделения системных ресурсов;
- Выполнение — процесс запущен, либо готов к запуску;
- Завершен — процесс был остановлен, получением сигнала завершения работы;
- Зомби — такой статус получают дочерние процессы, когда родительский процесс, породивший их завершается раньше них. В таком случае им в качестве нового родителя назначается init-процесс.
В последним состоянии процессов мы упомянули родительские процессы. Это очень важный момент, так как все процессы в Linux имеют своего родителя и построены в древовидном виде. Стартовый процесс — первый процесс в пользовательском пространстве — это init-процесс, он порождает другие процессы.
Теперь, когда мы понимаем, как работает команда ps и, что такое процессы в Linux — можно переходить непосредственно к работе с утилитой ps.
Использование команды ps
Синтаксис команды ps очень просто: ps -[опция]. Однако опций у ps просто море, чтобы разобраться в них, мы разбили их на 2 группы:
- Опции выбора процессов для отображения;
- Опции работы с форматом вывода данных на экран.
Начнем с опций команды ps, помогающих выбрать нужные процессы для отображения их состояний. Вот список опций выбора процессов для отображения:
- -A, -e, (a) - выбрать все процессы;
- -a - выбрать все процессы, кроме фоновых;
- -d, (g) - выбрать все процессы, даже фоновые, кроме процессов сессий;
- -N - выбрать все процессы кроме указанных;
- -С - выбирать процессы по имени команды;
- -G - выбрать процессы по ID группы;
- -p, (p) - выбрать процессы PID;
- --ppid - выбрать процессы по PID родительского процесса;
- -s - выбрать процессы по ID сессии;
- -t, (t) - выбрать процессы по tty;
- -u, (U) - выбрать процессы пользователя.
Чтобы просмотреть все запущенные процессы, используйте одну из следующих команд:
ps -e
или:
ps -A
Пример вывода:
PID TTY TIME CMD
1 ? 00:00:13 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:01 ksoftirqd/0
5 ? 00:00:00 kworker/0:0H
7 ? 00:00:01 migration/0
[...]
Чтобы показать все процессы, кроме лидеров сессии, выполните:
ps -d
Примечание: лидеры сеанса - процессы, у которых PID равен SID. Когда один процесс запускает другие процессы, он является лидером сеанса всех других процессов. Итак, представьте себе процесс A, который запускает процесс B и обрабатывает C. Процесс B запускает процесс D и процесс C запускает процесс E. Когда вы перечислите все процессы, за исключением сессий лидеров, вы увидите B, C, D и E, но не A.
Вы можете инвертировать вывод с помощью переключателя -N. Например, если вы хотите вывести только лидеров сеансов, выполните следующую команду:
ps -d -N
Очевидно, что данную опцию не очень разумно использовать с ключами -e или -A, поскольку в таком случае в консоль ничего не выведется.
Если вы хотите увидеть только процессы, связанные с этим терминалом, выполните:
ps T
Если вы хотите просмотреть все работающие (running) процессы, используя следующую команду:
ps r
Выбор конкретных процессов
Вы можете вывести определенные процессы с помощью ps с помощью различных критериев выбора.
Например, если вы знаете идентификатор процесса PID, вы можете просто использовать следующую команду:
ps -p <pid>
Например:
ps -p 22813
Вы можете выбрать несколько процессов, указав несколько идентификаторов процесса следующим образом:
ps -p "<pid1> <pid2>"
Например:
ps -p "22813 28599"
Вы также можете указать их с помощью списка, разделенного запятыми:
ps -p <pid1>,<pid2>
Например:
ps -p 22813,28599
Скорее всего, вы не будете знать идентификатор процесса, и его легче искать по команде. Для этого используйте следующую команду:
ps -C <команда>
Например:
ps -C nginx
Другие способы фильтрации результатов - по группам. Вы можете искать по имени группы, используя следующий синтаксис:
ps -G <groupname>
ps --Group <groupname>
Например, чтобы узнать все процессы, выполняемые группой accounts, выполните следующие действия:
ps -G "accounts"
ps --Group "accounts"
Вы также можете выполнять поиск по идентификатору группы GID вместо имени группы с помощью строчной буквы g следующим образом:
ps -g <groupid>
ps --group <groupid>
Если вы хотите найти все процессы, выполняемые конкретным пользователем, выполните следующую команду, указав имя пользователя:
ps U <userlist>
Например:
ps U gary
Обратите внимание, что это показывает человека, чьи учетные данные используются для запуска команды. Например, если вы вошли в систему как gary и запустите указанную выше команду, она покажет всю команду, которую вы выполняете. Если вы входите в систему как tom и используете sudo для запуска команды, то приведенная выше команда покажет команду tоm’а, которую запускает gary, а не tom.
Чтобы ограничить список только процессами, действительно запущенными gary, используйте следующую команду:
ps -U "gary"
Форматирование вывода команды ps
По умолчанию вы получаете четыре столбца, когда используете команду ps: PID, TTY, Time, Command. О них написано в начале статьи.
Вы можете получить полный список, выполнив следующую команду:
ps -ef
Опция -e, показывает все процессы, а -f показывает полную информацию: UID - идентификатор пользователя выполняющего команду, PID - это идентификатор процесса команды, PPID - идентификатор родительского процесса, который отпустил команду, C - количество дочерних процессов, STIME - это время начала процесса, TTY, TIME, CMD.
Вы можете получить еще больше информационных столбцов, используя следующую команду:
ps -eF
Дополнительные столбцы - SZ, RSS и PSR. SZ - это размер процесса, RSS - реальный размер памяти, а PSR - процессор, которому назначена команда.
Вы можете указать пользовательский формат, используя следующий формат:
ps -e --format <format>
Доступны следующие форматы: %cpu, %mem, args, c, cmd, comm, cp, cputime, egid, egroup, etime, euid, euser, gid, group, pgid, pgrp, ppid, start, sz, thcount, time, uid, uname и многие другие, ознакомиться с ними в разделе помощи man.
Чтобы использовать форматы, введите следующее:
ps -e --format="uid uname cmd time"
Вы можете смешивать и сопоставлять элементы по своему усмотрению.
Сортировка вывода
Чтобы отсортировать выходные данные, используйте следующие обозначения:
ps -ef --sort <sortcolumns>
Доступны следующие форматы: cmd, pcpu, flags, pgrp, cutime, cstime, utime, pid, ppid, size, uid, user и многие другие, ознакомиться с ними в разделе помощи man.
Пример команды сортировки выглядит следующим образом:
ps -ef --sort user,pid
Использование ps совместно с grep, more и less
Команды less и more помогают вам подробно просматривать результаты по одной странице за раз:
ps -ef | more
ps -ef | less
Утилита grep помогает фильтровать результаты из команды ps, например, чтобы вывести строки содержащие ключевое слово nginx:
ps -ef | grep nginx
В двух словах о команде ps
Команда ps — это мощный инструмент, позволяющий мониторить состояние процессов в Linux, а возможность комбинировать ps с другими командами, работающими с выводом данных в терминал, делает такую связку почти универсальной для точечного мониторинга.
Для вывода дерева процессов используется альтернативная команда ps — pstree. Команда ps выводит сведения о процессах в статическом виде. Для постоянного динамического мониторинга применяется команда htop. Конечно, это далеко не единственные программы для мониторинга процессов в Linux.
В нашей базе знаний есть статьи про другие программы мониторинга и аудита процессов и нагрузки в Linux:
- Аудит процессов Linux с помощью утилиты Autrace;
- Настройка и аудит системы Linux с помощью демона Auditd;
- Установка и настройка связки Grafana, Graphite, Carbon, Collectd на Debian и Ubuntu.
А если вы ищете производительные VPS под управлением Linux для широкого круга задач — обратите внимание на нашу услугу VPS хостинга. Познакомиться с услугой и при желании её заказать можно по ссылке ниже.