Linux #Linux #Ubuntu #Терминал #Процессы #Сервер #Диагностика

Как посмотреть и завершить процесс в Linux: ps, top, htop и kill

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

11 минут 2
Процессы в Linux: ps, top, htop и kill
Содержание
  1. 1Что такое процесс и PID
  2. 2ps: снимок всех процессов
  3. Дерево процессов
  4. 3Найти PID по имени: pgrep и pidof
  5. 4top: процессы в реальном времени
  6. 5htop: то же, но удобнее
  7. 6Как завершить процесс: kill
  8. Если процесс не реагирует: kill -9
  9. Чужие процессы
  10. 7pkill и killall: завершить по имени
  11. 8Зависшее окно: xkill
  12. 9Зомби-процессы
  13. 10Приоритет: nice и renice
  14. 11Фоновые задачи в терминале
  15. 12Кто занял порт
  16. 13Шпаргалка
  17. 14Главные советы
  18. 15Частые вопросы
  19. Как завершить процесс в Linux?
  20. Чем kill отличается от kill -9?
  21. Как узнать, какой процесс грузит процессор?
  22. Что делать, если kill -9 не помогает?
  23. Чем pkill отличается от killall?
  24. Как посмотреть процессы конкретного пользователя?
  25. Почему 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 aux
Вывод
USER         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 -p
Вывод
su(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 python
Вывод
5 python3 -m http.server 8000

Ключ -f ищет не только по имени программы, но и по всей строке запуска. Это нужно для скриптов: процесс называется bash, а имя скрипта — в аргументах:

Терминал
pgrep -af backup.sh

pidof проще: только точное имя программы и только номера.

Терминал
pidof yes
Вывод
6

top: процессы в реальном времени

top есть в любом Linux. Он обновляет список каждые три секунды и по умолчанию сортирует по загрузке процессора — то есть виновник торможения сразу окажется сверху:

Терминал
top
Вывод
top - 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 исчез сразу.

Самые нужные сигналы:

СигналНомерЧто делает
SIGTERM15просьба завершиться — по умолчанию
SIGKILL9немедленное завершение, отказаться нельзя
SIGHUP1«перечитай настройки» для многих служб
SIGINT2то же, что Ctrl + C
SIGSTOP19поставить на паузу
SIGCONT18продолжить после паузы

Полный список печатает 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.sh

killall завершает все процессы с точно таким именем. Ключ -v показывает, что именно закрыто:

Терминал
killall -v sleep
Вывод
Killed 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 41
Вывод
41 (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 :8000
Вывод
LISTEN 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.

Статья помогла?

Комментарии

Пока никто не написал. Будьте первым — вопрос или свой опыт одинаково полезны.

Комментарий появится после проверки. Ссылки и реклама не публикуются.