Список процессов Linux: как посмотреть запущенные процессы в терминале

Ноутбук с открытым окном терминала, в котором видна таблица из нескольких колонок Программирование и разработка

Полный список процессов Linux выводит команда ps aux или ps -ef, найти процесс по названию проще командой pgrep -a, а нагрузку в реальном времени показывает top.

Примеры запускались 1 октября 2026 года на сервере с утилитами procps-ng (ps, top, pgrep) и psmisc (pstree); номер версии procps-ng на этом сервере ps --version не сообщает. Сервер общий: команда видит только процессы своего пользователя, поэтому списки очень короткие. На домашней Ubuntu или своём VPS с Linux строк будет больше, формат столбцов тот же.

Задача Команда Linux
показать процессы текущего терминала ps
показать все процессы операционной системы ps aux или ps -ef
показать процессы определённого пользователя ps -u имя
найти PID по названию pgrep -a имя
показать дерево процессов pstree -p или ps -ef --forest
смотреть нагрузку в реальном времени top, htop
завершить процесс kill PID, pkill имя

Что такое процесс, PID и PPID

Процесс в Linux это запущенная программа: код в памяти, открытые файлы, переменные окружения и учёт процессорного времени. Одна программа может работать в нескольких экземплярах, и каждый имеет свой процесс.

PID (process ID) это идентификатор процесса, число, по которому к нему обращаются команды вроде kill и ps -p. PPID это идентификатор родительского процесса. Процессы умеют запускать другие процессы: оболочка запускает каждую введённую команду как дочерний процесс, а с & в конце строки отправляет его в фоновый режим. Цепочка родителей сходится к процессу с PID 1, в современных Ubuntu, Debian и Fedora это systemd. Потоки ядра Linux показаны в квадратных скобках, например [kthreadd]: аргументов у них нет, и ps выводит вместо них название.

Команда ps: список процессов в терминале Linux

Команда ps (process status) печатает снимок процессов на момент запуска и сразу завершается. Для наблюдения она не годится, зато результат команды удобно передавать в grep, sort, wc и в скрипты.

ps без опций

Без опций команда ps выводит процессы текущего пользователя, привязанные к тому же терминалу:

ps
  PID TTY          TIME CMD
 6398 pts/19   00:00:00 bash
 6399 pts/19   00:00:00 bash
 6400 pts/19   00:00:00 ps

TTY это терминал (pts/19 значит псевдотерминал сессии ssh), TIME это процессорное время, накопленное процессом, а не срок с момента запуска. В CMD только название программы без аргументов.

ps aux и ps -ef: все запущенные процессы

У команды ps два синтаксиса опций. BSD-стиль пишется без дефиса (ps aux), стиль UNIX и POSIX с дефисом (ps -ef). Обе команды выводят список всех запущенных процессов. Часть столбцов у них общая (PID, TTY, TIME), остальные различаются:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
UID        PID  PPID  C STIME TTY          TIME CMD

Первая строка это шапка ps aux, вторая шапка ps -ef. В ps aux буква a снимает ограничение «только свои процессы», x добавляет процессы без терминала (демоны, системные службы), u включает формат с пользователем, памятью и нагрузкой. В ps -ef опция -e выбирает все процессы, -f включает полный формат с PPID и аргументами.

Колонка Что означает
USER, UID владелец процесса; длинное имя ps обрезает по ширине колонки и ставит + в конце
PID, PPID идентификатор процесса и родительского процесса
%CPU, C доля процессора за весь срок жизни процесса
%MEM доля физической памяти
VSZ, RSS виртуальная и резидентная память в КиБ
TTY терминал, ? у процессов без терминала
STAT состояние процесса, коды в разделе ниже
START, STIME момент запуска
TIME накопленное процессорное время
COMMAND, CMD команда с аргументами
Читайте также:  Async/await в JavaScript: как работает и где ошибаются

Чтобы увидеть идентификатор родителя конкретного процесса, используйте ps -ef; если нужна информация о памяти и нагрузке, ps aux. Писать ps -aux с дефисом мы не советуем: по стандарту POSIX это «все процессы с терминалом, кроме лидеров сессий, плюс процессы пользователя x». Если такого пользователя нет, procps-ng догадывается, что имелось в виду ps aux, но на системе с пользователем x результат будет другим.

Колонку %CPU в ps нельзя принимать за текущую нагрузку. Она считается как процессорное время, делённое на срок жизни процесса. Процесс, который час простаивал и минуту назад занял ядро целиком, покажет маленький процент, а top покажет почти 100.

Пользовательский формат вывода и сортировка

Опция -o задаёт столбцы, -e добавляет все процессы, --sort сортирует (минус перед полем означает «по убыванию»). Доступные поля выводит ps L, любое из них можно добавить в -o, подробно они описаны в man ps. Так ищут процессы, которые занимают больше всего памяти:

ps -eo pid,comm,rss,%mem --sort=-rss | head -4
  PID COMMAND           RSS %MEM
 6336 /opt/webserver/ 215288  0.0
49104 bash            20372  0.0
 6360 sshd-session     4652  0.0

RSS указан в кибибайтах: веб-сервер занимает около 210 МиБ. На сервере около 250 ГиБ памяти, доля веб-сервера меньше десятой процента, и колонка %MEM показывает 0.0. В колонке COMMAND видно ещё одно ограничение: поле comm обрезано до 15 символов.

Для отладки удобно вывести идентификаторы, состояние и срок работы. Поле etime показывает, сколько прошло с запуска:

ps -o pid,ppid,stat,etime,comm
  PID  PPID STAT     ELAPSED COMMAND
 7568  7529 S          00:01 sshd-session
 7584  7568 Ss         00:01 bash
 7585  7584 S          00:01 sleep
 7586  7584 S          00:01 sleep
 7592  7584 R          00:00 ps
49062 49014 S          02:51 sshd-session

По столбцу PPID видно цепочку: sshd-session (7568) запустил bash (7584), а тот запустил два sleep в фоновом режиме и саму команду ps. Этот и следующие примеры запускались по ssh без терминала, поэтому ps без опций выбора показал все процессы пользователя без TTY, включая соседнее подключение в последней строке.

Процессы пользователя, PID и программы

Опции выбора: -u по эффективному пользователю, -U по реальному, -p по PID, --ppid по родителю, -C по программе:

ps -u www-data          # процессы пользователя www-data (по эффективному UID)
ps -U root -u root u    # процессы root в пользовательском формате
ps -p 1234 -o pid,etime,cmd   # один процесс по PID
ps --ppid 1234          # дочерние процессы 1234
ps -C nginx -o pid=     # только идентификаторы процессов nginx

Опция -C сравнивает только название программы, без аргументов. Знак = после поля убирает заголовок колонки, и результат удобно подставлять в скрипт. ps axZ добавляет контекст безопасности SELinux.

Чтобы посчитать процессы, передайте вывод в wc -l, а шапку уберите опцией --no-headers, иначе она попадёт в счёт:

ps -e --no-headers | wc -l
10

Как найти процесс по имени: grep, pgrep и pidof

Чтобы найти процессы, связанные с одной программой, чаще всего пишут ps aux | grep имя. Она работает, но находит лишний процесс. В примере запущены sleep 300 и sleep 301, а вместо aux взят короткий формат -eo pid,args:

ps -eo pid,args | grep "sleep 30"
 7585 sleep 300
 7586 sleep 301
 7597 grep sleep 30

Третья строка это сам grep: в его аргументах тоже есть «sleep 30». Шаблон [s]leep совпадает со словом «sleep», но не с собственным текстом, и лишняя строка пропадает:

ps -eo pid,args | grep "[s]leep 30"
 7585 sleep 300
 7586 sleep 301

PID по названию проще всего получить через pgrep: она не находит сама себя и возвращает код 1, если совпадений нет.

pgrep -a sleep   # идентификатор и аргументы
pgrep -c sleep   # количество совпадений
pidof sleep      # все идентификаторы через пробел
7585 sleep 300
7586 sleep 301
2
7586 7585

Без опций pgrep сравнивает шаблон с названием процесса, которое ограничено 15 символами, как обрезанный путь /opt/webserver/ выше. Шаблон длиннее этого совпадёт только с -f: тогда сравнивается вся командная строка. У -f своя ловушка. Когда мы запускали примеры одним скриптом через bash -c, pgrep -f "sleep 301" вернул три идентификатора: сам sleep и две оболочки, в чьих аргументах был этот текст. Следующая строка скрипта, pkill -f "sleep 30", по той же причине завершила оболочку, и прогон оборвался. Перед pkill -f проверьте список через pgrep -af. Опция -x отсекает похожие имена: pgrep -x sle ничего не находит (код 1), а pgrep sle выводит оба sleep.

Скрипту часто надо дождаться завершения процесса. Для этого подходит цикл while с проверкой по идентификатору: в условии стоит ps -p, который возвращает ненулевой код, когда процесса уже нет:

sleep 3 & PID=$!
while ps -p "$PID" > /dev/null; do
  echo "процесс $PID ещё работает"
  sleep 1
done
echo "процесс $PID завершился"
процесс 14215 ещё работает
процесс 14215 ещё работает
процесс 14215 ещё работает
процесс 14215 завершился

Проверять тот же цикл через pgrep -x sleep нельзя: он найдёт любой процесс sleep в системе, свой или чужой, и цикл будет крутиться, пока такой есть.

Читайте также:  typeof в JavaScript: что возвращает оператор для каждого типа данных

Дерево процессов: pstree и ps —forest

Команда pstree отображает родителей и потомков. С -p рядом с названием выводятся идентификаторы, а если передать PID аргументом, дерево строится от этого процесса. $$ раскрывается в идентификатор текущей оболочки:

pstree -p $$
bash(7584)-+-pstree(7600)
           |-sleep(7585)
           `-sleep(7586)

Без -p одинаковые ветки сворачиваются: запись init---4*[getty] означает четыре дочерних процесса getty у одного родителя, а названия в фигурных скобках это потоки. pstree -a добавляет аргументы, pstree -s PID выводит цепочку родителей до процесса 1. На минимальных образах и в контейнерах пакета psmisc может не быть, тогда то же дерево даёт ps:

ps -o pid,ppid,comm --forest
  PID  PPID COMMAND
49062 49014 sshd-session
 7568  7529 sshd-session
 7584  7568  \_ bash
 7585  7584      \_ sleep
 7586  7584      \_ sleep
 7601  7584      \_ ps

Дерево всей системы выводят ps -ef --forest и ps axjf.

Коды состояния процесса в колонке STAT

Первая буква в колонке STAT это состояние процесса, остальные символы дают дополнительные флаги.

Код Значение
R в состоянии выполнения или в очереди на процессор
S спит и ждёт события (большинство процессов)
D непрерываемый сон, обычно ожидание ввода-вывода
I простаивающий поток ядра
T остановлен сигналом, например Ctrl+Z
Z зомби: завершился, но родитель не забрал код возврата
s лидер сессии
l многопоточный
+ в группе процессов переднего плана
< и N высокий и низкий приоритет

Зомби легко сделать руками: подоболочка запускает короткий sleep 1, а потом через exec превращается в sleep 5, который не ждёт своих детей.

(sleep 1 & exec sleep 5) &
sleep 2; ps -o pid,ppid,stat,comm,args --ppid $!
  PID  PPID STAT COMMAND         COMMAND
22701 22699 Z    sleep <defunct> [sleep] <defunct>

Зомби не тратит процессор и память, у него осталась только строка в таблице процессов. Убить его командой kill нельзя, он уже мёртв. Запись исчезнет, когда завершится родитель (22699) или когда он вызовет wait. Если зомби копятся сотнями, проблема в программе-родителе, её и надо чинить.

Команда top: мониторинг процессов в реальном времени

Команда top перерисовывает таблицу через заданный интервал (его задаёт параметр -d) и по умолчанию сортирует процессы по использованию процессора. Верхние строки сводки:

top - 05:20:54 up 28 days,  3:27,  0 users,  load average: 8.43, 7.52, 8.27
Tasks:  11 total,   1 running,   9 sleeping,   0 stopped,   1 zombie,   0 d-stat
%Cpu(s):  8.7 us,  2.2 sy,  0.0 ni, 88.9 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
MiB Mem : 257536.3 total,  43758.4 free,  83618.1 used, 130159.8 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.  75167.3 avail Mem 

В строке Tasks видно и зомби, созданный перед запуском top. В Linux load average это среднее число процессов, которые выполняются (R) или ждут диска (D), за 1, 5 и 15 минут. На сервере с 48 ядрами такая нагрузка невелика: 88.9 % времени процессор простаивает (id). Колонка %CPU в top считается за интервал с прошлого обновления, поэтому с её помощью можно понять, кто грузит процессор сейчас.

top -u www-data выводит процессы одного пользователя, top -p 1234 следит за одним процессом, top -o %MEM сортирует по памяти. Для скрипта или лога нужен пакетный режим: top -b -n 1 один раз печатает снимок в стандартный вывод и завершается.

Просмотр процессов в htop

Утилита htop удобнее top: тот же список в цвете, с полосами загрузки ядер и прокруткой мышью. Во многих дистрибутивах её ставят отдельно: sudo apt install htop на Debian и Ubuntu, sudo dnf install htop на Fedora. На нашем сервере её нет, примера вывода не будет. Основные клавиши подписаны внизу экрана: F3 ищет по команде, F4 включает фильтрацию списка, F5 показывает дерево процессов, F6 выбирает колонку для сортировки, F9 отправляет сигнал выбранному процессу. Клавиша u оставляет процессы одного пользователя, M и P сортируют по памяти и процессору аналогично top.

Откуда ps берёт информацию о процессах

Команды ps, top и pgrep читают виртуальную файловую систему /proc. У каждого процесса там каталог, названный его номером. Файл status содержит состояние, PPID и владельца, вот его начало для одного из sleep:

head -9 /proc/7586/status
Name:   sleep
Umask:  0022
State:  S (sleeping)
Tgid:   7586
Ngid:   0
Pid:    7586
PPid:   7584
TracerPid:  0
Uid:    1000    1000    1000    1000

В /proc/PID/cmdline находится командная строка с нулевыми байтами между аргументами, в /proc/PID/fd открытые файлы, в /proc/PID/limits ограничения на использование ресурсов.

Как завершить процесс командами kill, pkill и killall

kill PID отправляет сигнал SIGTERM (15), он позволяет программе сохранить данные и закрыться самой. kill -9 PID отправляет SIGKILL, который перехватить нельзя: ядро снимает процесс сразу, без уборки за собой. Поэтому -9 применяется последним: сначала обычный kill, через несколько секунд проверка командой ps -p PID.

sleep 60 & P=$!
kill $P
sleep 0.2; ps -p $P > /dev/null; echo "after kill exit=$?"
after kill exit=1

Команде pkill nginx не нужно знать PID: она отправляет сигнал всем процессам с подходящим названием по правилам pgrep. killall nginx из пакета psmisc завершает все процессы с этим именем команды и, как kill, по умолчанию шлёт SIGTERM. Чужие процессы и процессы root завершаются только с правами администратора, через sudo.

Частые вопросы

Чем ps aux отличается от ps -ef?

Обе команды выводят все процессы в разных форматах: у ps aux (синтаксис BSD) есть STAT и столбцы с нагрузкой на процессор и памятью (%CPU, %MEM, VSZ, RSS), у ps -ef (синтаксис UNIX) вместо них PPID. Момент запуска выводят оба: START и STIME.

Почему ps показывает не все процессы?

Без опций ps выводит только процессы текущего терминала, для полного списка нужен -e или aux. Если и в этом случае список короткий, чужие процессы скрыты: так бывает в контейнере со своим пространством PID или когда /proc смонтирован с опцией hidepid. Пример: на нашем сервере ps -e выдал 10 строк, а ps -p 1 не нашёл даже процесс 1.

Какой командой узнать, сколько работает процесс?

ps -p PID -o etime= печатает время с запуска в формате [[дни-]часы:]минуты:секунды.

Как вывести потоки процесса в Linux?

ps -eLf выводит каждый поток отдельно, с номером LWP, ps -T -p PID показывает потоки одного процесса. В top режим потоков переключает клавиша H.

Оцените статью
bestprogrammer.ru
Добавить комментарий