Полный список процессов 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
- Команда ps: список процессов в терминале Linux
- ps без опций
- ps aux и ps -ef: все запущенные процессы
- Пользовательский формат вывода и сортировка
- Процессы пользователя, PID и программы
- Как найти процесс по имени: grep, pgrep и pidof
- Дерево процессов: pstree и ps —forest
- Коды состояния процесса в колонке STAT
- Команда top: мониторинг процессов в реальном времени
- Просмотр процессов в htop
- Откуда ps берёт информацию о процессах
- Как завершить процесс командами kill, pkill и killall
- Частые вопросы
- Чем ps aux отличается от ps -ef?
- Почему ps показывает не все процессы?
- Какой командой узнать, сколько работает процесс?
- Как вывести потоки процесса в Linux?
Что такое процесс, 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 | команда с аргументами |
Чтобы увидеть идентификатор родителя конкретного процесса, используйте 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 в системе, свой или чужой, и цикл будет крутиться, пока такой есть.
Дерево процессов: 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 считается за интервал с прошлого обновления, поэтому с её помощью можно понять, кто грузит процессор сейчас.
| Клавиша | Действие |
|---|---|
| P | сортировать по %CPU |
| M | сортировать по памяти |
| T | по накопленному времени |
| c | команда с аргументами вместо названия |
| 1 | показать каждое ядро отдельно |
| k | отправить сигнал, по умолчанию SIGTERM |
| q | выйти |
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.








