Как посмотреть и завершить процесс в Linux: ps, top, htop и kill
Как в терминале Linux посмотреть запущенные процессы, найти программу, которая грузит процессор, и завершить зависший процесс: ps, top, htop, pgrep, kill, pkill и killall. Чем SIGTERM отличается от kill -9, что такое зомби и как понизить приоритет.

Содержание
- 1Что такое процесс и PID
- 2ps: снимок всех процессов
- Дерево процессов
- 3Найти PID по имени: pgrep и pidof
- 4top: процессы в реальном времени
- 5htop: то же, но удобнее
- 6Как завершить процесс: kill
- Если процесс не реагирует: kill -9
- Чужие процессы
- 7pkill и killall: завершить по имени
- 8Зависшее окно: xkill
- 9Зомби-процессы
- 10Приоритет: nice и renice
- 11Фоновые задачи в терминале
- 12Кто занял порт
- 13Шпаргалка
- 14Главные советы
- 15Частые вопросы
- Как завершить процесс в Linux?
- Чем kill отличается от kill -9?
- Как узнать, какой процесс грузит процессор?
- Что делать, если kill -9 не помогает?
- Чем pkill отличается от killall?
- Как посмотреть процессы конкретного пользователя?
- Почему free памяти так мало, хотя ничего не запущено?
Программа зависла и не закрывается. Вентилятор воет, а что грузит процессор — непонятно. Сервер отвечает через раз, потому что какой-то скрипт съел всю память. В Windows в таких случаях открывают «Диспетчер задач». В Linux его заменяют несколько команд, и на сервере без графики только они и есть.
Ниже — всё по порядку: как посмотреть процессы, как найти нужный и как его завершить, начиная с вежливого способа и заканчивая kill -9. Чтобы примеры были наглядными, я запустил на тестовой машине несколько «подопытных»: скрипт резервного копирования backup.sh, команду yes, которая грузит ядро процессора на 100 %, и пару sleep. Все выводы ниже — настоящие, с Ubuntu 24.04 (procps-ng 4.0.4, htop 3.3.0).
Что такое процесс и PID
Каждая запущенная программа в Linux — это процесс с уникальным номером PID. Почти все команды управления работают именно с этими номерами: сначала находим PID, потом что-то с ним делаем.
У каждого процесса есть родитель (PPID) — тот, кто его запустил. Терминал запускает оболочку bash, bash запускает ваш скрипт, скрипт запускает sleep. Это важно: если завершить родителя, вместе с ним часто закрываются и дети.
ps: снимок всех процессов
ps показывает процессы на момент запуска команды. Самый полезный вариант — ps aux:
ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
nixlife 2 0.0 0.0 4920 3584 ? Ss 22:44 0:00 bash /tmp/lx/proc/run2.sh
nixlife 5 0.0 0.0 4920 3592 ? S 22:44 0:00 /bin/bash ./backup.sh
nixlife 6 99.5 0.0 3156 1908 ? R 22:44 0:01 yes
nixlife 8 0.0 0.0 3156 2032 ? S 22:44 0:00 sleep 300
nixlife 10 0.0 0.0 3156 2032 ? S 22:44 0:00 sleep 5
nixlife 11 0.0 0.0 8504 4556 ? R 22:44 0:00 ps auxКак читать колонки:
| Колонка | Что означает |
|---|---|
| USER | от чьего имени работает процесс |
| PID | номер процесса — его вы передадите в kill |
| %CPU | загрузка процессора; 100 % — одно ядро целиком |
| %MEM | доля оперативной памяти |
| RSS | сколько памяти процесс занимает реально, в КБ |
| STAT | состояние: R — работает, S — ждёт, D — ждёт диск, Z — зомби, T — остановлен |
| COMMAND | команда, которой процесс запущен |
На настоящем сервере ps aux выдаст сотни строк, поэтому его почти всегда комбинируют с фильтром или сортировкой. Пять самых прожорливых по процессору:
ps -eo pid,ppid,user,%cpu,%mem,cmd --sort=-%cpu | head PID PPID USER %CPU %MEM CMD
6 2 nixlife 98.5 0.0 yes
2 1 nixlife 0.0 0.0 bash /tmp/lx/proc/run2.sh
5 2 nixlife 0.0 0.0 /bin/bash ./backup.sh
8 2 nixlife 0.0 0.0 sleep 300
10 5 nixlife 0.0 0.0 sleep 5Для памяти замените --sort=-%cpu на --sort=-%mem. Минус означает «по убыванию».
Дерево процессов
Кто кого запустил, удобно смотреть командой pstree (ключ -p добавляет PID):
pstree -psu(1)---bash(2)-+-backup.sh(5)---sleep(10)
|-pstree(17)
|-sleep(8)
`-yes(6)Сразу видно, что sleep(10) запустил backup.sh. Если скрипт «висит», а в ps видна только его дочерняя команда, дерево покажет, кого завершать на самом деле. ps -ef --forest даёт похожую картину в привычном табличном виде.
Найти PID по имени: pgrep и pidof
Листать ps aux глазами неудобно. pgrep ищет по имени и сразу печатает PID, ключ -a добавляет полную команду:
pgrep -a python5 python3 -m http.server 8000Ключ -f ищет не только по имени программы, но и по всей строке запуска. Это нужно для скриптов: процесс называется bash, а имя скрипта — в аргументах:
pgrep -af backup.shpidof проще: только точное имя программы и только номера.
pidof yes6top: процессы в реальном времени
top есть в любом Linux. Он обновляет список каждые три секунды и по умолчанию сортирует по загрузке процессора — то есть виновник торможения сразу окажется сверху:
toptop - 22:44:47 up 9 min, 0 user, load average: 0.26, 0.30, 0.18
Tasks: 8 total, 2 running, 6 sleeping, 0 stopped, 0 zombie
%Cpu(s): 23.8 us, 28.6 sy, 0.0 ni, 47.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 8027.6 total, 6232.6 free, 549.6 used, 1499.9 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 7478.0 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6 nixlife 20 0 3156 1908 1768 R 100.0 0.0 0:02.21 yes
2 nixlife 20 0 4920 3584 3180 S 0.0 0.0 0:00.00 bash
5 nixlife 20 0 4920 3592 3200 S 0.0 0.0 0:00.00 backup.sh
8 nixlife 20 0 3156 2032 1896 S 0.0 0.0 0:00.00 sleepЧто смотреть в шапке:
- 📈 load average — средняя нагрузка за 1, 5 и 15 минут. Грубо: если число больше количества ядер, процессы стоят в очереди.
- 🧮 %Cpu(s):
us— программы,sy— ядро системы,id— простой,wa— ожидание диска. Высокийwaпри низкомusзначит, что тормозит диск, а не процессор. - 🧠 avail Mem — сколько памяти реально доступно программам.
freeпочти всегда маленький, и это нормально: Linux занимает свободную память под кэш и отдаёт её по первому требованию.
Полезные клавиши внутри top:
| Клавиша | Действие |
|---|---|
| P | сортировать по процессору |
| M | сортировать по памяти |
| 1 | показать каждое ядро отдельно |
| c | полная строка запуска вместо имени |
| k | завершить процесс: top спросит PID и сигнал |
| q | выйти |
htop: то же, но удобнее
htop — улучшенный top: цветные шкалы загрузки по каждому ядру, прокрутка, поиск и управление мышью. В Ubuntu Desktop он обычно уже стоит, на сервере:
sudo apt install htop
htopКлавиши внизу экрана подписаны, но вот главные:
- 🔎 F3 — поиск по имени, F4 — фильтр: в списке останутся только подходящие процессы.
- 🌳 F5 — дерево процессов, как
pstree. - 🔃 F6 — выбрать колонку для сортировки. Или просто щёлкните по заголовку колонки мышью.
- 🛑 F9 — завершить выбранный процесс: htop предложит список сигналов, по умолчанию
SIGTERM. - 🐢 F7 и F8 — изменить приоритет (об этом ниже).
- 👤 u — показать процессы одного пользователя.
Если на сервере несколько служб и нужно понять, какая из них ест память, htop с сортировкой по MEM% и деревом (F5) — самый быстрый способ. Подробнее о том, как читать нагрузку на Linux-машине, — в статье Информация о системе в терминале.
Как завершить процесс: kill
Название обманчиво: kill не «убивает», а посылает сигнал. Какой именно — решаете вы, а процесс сам решает, как на него реагировать.
kill 6Без указания сигнала отправляется SIGTERM (номер 15) — вежливая просьба завершиться. Нормальная программа на неё успевает сохранить данные, закрыть файлы и соединения. В моём примере yes исчез сразу.
Самые нужные сигналы:
| Сигнал | Номер | Что делает |
|---|---|---|
SIGTERM | 15 | просьба завершиться — по умолчанию |
SIGKILL | 9 | немедленное завершение, отказаться нельзя |
SIGHUP | 1 | «перечитай настройки» для многих служб |
SIGINT | 2 | то же, что Ctrl + C |
SIGSTOP | 19 | поставить на паузу |
SIGCONT | 18 | продолжить после паузы |
Полный список печатает kill -l. Указывать сигнал можно номером или именем — kill -9 PID и kill -KILL PID одинаковы.
Если процесс не реагирует: kill -9
Программа может перехватить или проигнорировать SIGTERM. Я проверил это на скрипте, который игнорирует сигнал: после обычного kill он продолжил работать в состоянии S. А kill -9 закрыл его сразу:
PID STAT CMD
26 S bash -c trap "" TERM; while true; do sleep 1; done
run2.sh: line 18: 26 Killed bash -c 'trap "" TERM; while true; do sleep 1; done'SIGKILL процесс не может ни перехватить, ни проигнорировать: его останавливает само ядро. Но у этой силы есть цена — программа не успеет ничего сохранить. База данных после kill -9 может запускаться с проверкой, а недописанный файл останется недописанным.
Чужие процессы
Обычный пользователь может завершать только свои процессы. Попытка закрыть чужой заканчивается так:
bash: line 1: kill: (2324) - Operation not permittedДля процессов других пользователей и системных служб нужен sudo kill PID.
pkill и killall: завершить по имени
Чтобы не искать PID отдельно, есть команды, которые работают с именем сразу.
pkill понимает те же ключи, что pgrep. Завершить скрипт по имени файла:
pkill -f backup.shkillall завершает все процессы с точно таким именем. Ключ -v показывает, что именно закрыто:
killall -v sleepKilled sleep(6) with signal 15
Killed sleep(30) with signal 15Несмотря на слово Killed, сигнал здесь тоже вежливый — 15, SIGTERM.
Зависшее окно: xkill
На рабочем столе с X11 есть способ проще всех: выполните xkill, курсор превратится в крестик — щёлкните по зависшему окну. В Ubuntu с Wayland xkill работает только для программ, запущенных через XWayland. Универсальный вариант на рабочем столе — «Системный монитор»: правый щелчок по процессу → «Завершить» или «Убить».
Зомби-процессы
Иногда в ps или top появляются строки со статусом Z и пометкой <defunct>:
ps -eo pid,ppid,stat,cmd | grep -E 'Z|STAT' PID PPID STAT CMD
38 36 Z [python3] <defunct>Зомби — это процесс, который уже завершился, но родитель ещё не «забрал» его код возврата. Он не тратит ни процессор, ни память — только строчку в таблице процессов. Убивать зомби бессмысленно: kill -9 на него не действует, он и так мёртв.
Что делать: найдите родителя по колонке PPID (здесь — 36) и перезапустите его. Когда родитель завершится, зомби исчезнет. Один-два зомби — не проблема. Сотни зомби означают ошибку в программе-родителе.
Приоритет: nice и renice
Не всё нужно завершать. Если долгая задача — архивация, перекодирование видео — мешает остальным, понизьте ей приоритет. В Linux он называется nice и идёт от −20 (самый высокий) до 19 (самый низкий). Обычные программы запускаются с 0.
Запустить команду с пониженным приоритетом:
nice -n 10 tar --zstd -cf backup.tar.zst /var/wwwИзменить приоритет уже работающему процессу:
renice -n 15 -p 4141 (process ID) old priority 10, new priority 15Повышать приоритет (отрицательные значения) может только root. Важно понимать: nice не ограничивает процесс, если процессор свободен. Мой тестовый yes с nice 10 всё равно занимал 98 % ядра — просто как только понадобится место другим, он уступит первым.
Фоновые задачи в терминале
Ещё один частый сценарий — вы запустили долгую команду и забыли поставить &:
- ⏸ Ctrl + Z — поставить на паузу (сигнал SIGTSTP).
- 🔙
bg— продолжить её в фоне,fg— вернуть на передний план. - 📋
jobs— список фоновых задач этого терминала. Завершить задачу —kill %1, где 1 — её номер вjobs.
Но помните: при закрытии терминала или обрыве SSH фоновые задачи, скорее всего, завершатся. Для долгих задач на сервере используйте tmux, а для постоянных — свой сервис в systemd.
Кто занял порт
Частая причина «процесс мешает» — служба не запускается, потому что порт уже занят. Найти виновника:
sudo ss -tlnp | grep :8000LISTEN 0 5 0.0.0.0:8000 0.0.0.0:* users:(("python3",pid=5,fd=3))PID указан прямо в выводе. Подробно о портах — в статье Как посмотреть открытые порты в Linux.
Шпаргалка
| Задача | Команда |
|---|---|
| Все процессы | ps aux |
| Топ по процессору | ps -eo pid,user,%cpu,%mem,cmd --sort=-%cpu | head |
| Топ по памяти | ps -eo pid,user,%cpu,%mem,cmd --sort=-%mem | head |
| В реальном времени | top или htop |
| Дерево процессов | pstree -p |
| PID по имени | pgrep -a имя, для скриптов pgrep -af имя |
| Завершить вежливо | kill PID |
| Завершить принудительно | kill -9 PID |
| Завершить по имени | pkill имя или killall имя |
| Понизить приоритет | renice -n 10 -p PID |
| Кто занял порт | sudo ss -tlnp | grep :порт |
Главные советы
- Сначала найдите, потом завершайте.
pgrep -a имяпокажет, что именно попадёт подpkill. - Начинайте с вежливого
kill. SIGTERM даёт программе сохранить данные.kill -9— только если через 10 секунд процесс жив. - Службы — через systemctl.
sudo systemctl restart nginxвместоkillдля nginx, баз данных и всего, что запускает systemd. - Зомби не убиваются. Перезапустите родителя из колонки PPID.
- Не мешает — не убивайте. Долгой задаче достаточно понизить приоритет через
renice. - Осторожно с
pkill ssh. Он закроет иsshd— вместе с вашим доступом к серверу.
Частые вопросы
Как завершить процесс в Linux?
Найдите его PID командой pgrep -a имя или ps aux, затем выполните kill PID. Если процесс не закрылся за несколько секунд, используйте kill -9 PID. Для чужих и системных процессов добавьте sudo.
Чем kill отличается от kill -9?
kill отправляет SIGTERM — просьбу завершиться: программа может сохранить данные и корректно закрыться. kill -9 отправляет SIGKILL — ядро останавливает процесс немедленно, без шанса что-то сохранить. Поэтому -9 — последнее средство.
Как узнать, какой процесс грузит процессор?
Запустите top или htop — они сразу сортируют список по загрузке процессора, виновник окажется сверху. Без интерактива: ps -eo pid,user,%cpu,cmd --sort=-%cpu | head.
Что делать, если kill -9 не помогает?
Скорее всего, процесс в состоянии D — ждёт ответа от диска или сетевой папки, — или это зомби (Z). Процесс в D завершится, когда устройство ответит; часто виноваты зависшая сетевая папка или умирающий диск. Зомби исчезнет после перезапуска родителя.
Чем pkill отличается от killall?
killall завершает процессы с точно таким именем. pkill ищет по части имени, а с ключом -f — по всей строке запуска, поэтому подходит для скриптов. Зато с ним легче случайно завершить лишнее: сначала проверяйте через pgrep -a.
Как посмотреть процессы конкретного пользователя?
ps -u имя или pgrep -au имя. В htop нажмите u и выберите пользователя из списка.
Почему free памяти так мало, хотя ничего не запущено?
Linux использует свободную память под кэш диска — в top это buff/cache. Кэш отдаётся программам по первому требованию. Смотрите на avail Mem: это память, которая реально доступна. Если доступно мало, пригодится swap.
Если статья пригодилась — отметьте, это помогает выбирать темы
Статья помогла?
Комментарии
Пока никто не написал. Будьте первым — вопрос или свой опыт одинаково полезны.