Работа с процессами: ps, top, htop, kill, systemd

TIP

Эта статья — часть серии Linux administration, посвящённой самостоятельному администрированию Linux, Self-Hosting и DevOps. Управление процессами — ключ к стабильности, производительности и диагностике проблем.

📌 О чём эта статья?

Процесс — это запущенная программа. В любой момент в Linux работает десятки, а то и сотни процессов: от ядра до веб-сервера и вашего терминала.

В этой статье вы научитесь:

  • Просматривать запущенные процессы (ps, top, htop)
  • Анализировать потребление ресурсов
  • Управлять процессами вручную (kill, сигналы)
  • Работать с системными службами через systemd
  • Диагностировать “подвисшие” или “жадные” процессы

🧩 Что такое процесс в Linux?

Процесс — это запущенный экземпляр программы. У каждого процесса есть:

  • PID (Process ID) — уникальный числовой идентификатор
  • PPID (Parent PID) — PID родительского процесса
  • Имя (например, nginx, bash)
  • Пользователь, от имени которого запущен
  • Потребление CPU, памяти
  • Состояние: работает, спит, остановлен, “зомби”

NOTE

Особое значение имеет процесс с PID 1, который является первым процессом, запускаемым ядром системы. В современных дистрибутивах Linux (таких как Fedora, Ubuntu, CentOS, openSUSE и RHEL) этим процессом является systemd.

Демоны (daemons) — это процессы, работающие в фоновом режиме и выполняющие различные системные или сетевые службы без прямого взаимодействия с пользователем. Их имена часто заканчиваются на букву ‘d’ (например, httpd, sshd, systemd).


📋 ps — снимок процессов

Команда ps (process status) используется для отображения моментального снимка запущенных процессов. В отличие от интерактивных мониторов, ps показывает состояние процессов на момент выполнения команды. Большая часть информации, отображаемой ps, извлекается из псевдофайловой системы /proc.

Основные варианты использования

ps                    # Процессы текущего пользователя в текущей сессии
ps aux                # Все процессы (рекомендуется)
ps faux               # Иерархия процессов (с деревом)
ps -ef                # Альтернативный формат (POSIX)

Что означает ps aux?

ФлагЗначение
aВсе процессы, связанные с терминалами
uПодробный формат (пользователь, %CPU, %MEM)
xПроцессы без терминала (демоны)

Пример вывода:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.3 169408 13024 ?        Ss   Mar20   0:15 /sbin/init
alice     1234  1.2  2.1 543210 87654 pts/0    S+   12:00   0:05 bash

Ключевые колонки:

  • PID — идентификатор
  • %CPU, %MEM — Процент использования ЦП, физической памяти.
  • VSZ — виртуальная память (KiB). Это размер памяти, которую выделили процессу, но не обязательно, что он успел в неё что-то записать. Виртуальная память позволяет системе исполнять код приложений, используя больший объём памяти, чем физически доступно. habr.com
  • RSS — физическая память (KiB). Это память, которую процесс занял, то есть что-то сохранил в виртуальную память. Резидентная память показывает, сколько процесс потребляет физической памяти. habr.com
  • TTY: Терминал, к которому привязан процесс. ? означает, что процесс не привязан к терминалу (обычно фоновые демоны).
  • STAT — текущее состояние процесса
  • COMMAND — команда, запустившая процесс
  • TIME: Суммарное время ЦП, потребленное процессом.

INFO

Состояния процессов:

  • R — running
  • S — sleeping (прерываемый сон)
  • D — uninterruptible sleep (Непрерывный сон)
  • T — stopped
  • Z — zombie (зомби)
  • + — на переднем плане

Uninterruptible sleep (Непрерывный сон)

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

Особенности uninterruptible sleep:

  • Процесс не реагирует на сигналы и остаётся заблокированным до желаемого события.
  • Сигналы, накопленные во время сна, замечаются только при возвращении процесса из системного вызова или ловушки (если указано при переходе в состояние).
  • Такие процессы ==не могут быть завершены даже с помощью сигнала SIGKILL==, единственный способ избавиться от них — перезагрузить систему.

Процесс-зомби (zombie process)

Это завершённый дочерний процесс, который всё ещё остаётся в таблице процессов операционной системы, потому что его родительский процесс ещё не прочитал его статус завершения с помощью системного вызова wait() или waitpid().

Почему это проблема?
  • Зомби не потребляют CPU или RAM, но занимают запись в таблице процессов.
  • Если накопится слишком много зомби, система может исчерпать лимит на количество процессов (обычно ограничен pid_max).
  • Это признак некорректной обработки дочерних процессов в программе.
Как “убить” зомби?

Напрямую убить зомби нельзя, потому что он уже мёртв. Единственный способ — заставить родительский процесс вызвать wait().

Если родительский процесс не делает этого (например, содержит баг), можно:

  1. Перезапустить родительский процесс — тогда зомби будут унаследованы процессом init (PID 1), который автоматически вызывает wait() и «убирает» зомби.
  2. Убить родительский процесс — тогда зомби станут дочерними для init, и он их «приберёт».

Убивать зомби через kill -9 бесполезно — они уже не работают.


🔍 top — динамический мониторинг

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

Основные возможности и вывод:

  • up: время непрерывной работы системы (uptime).
  • N user: количество пользователей, вошедших в систему (через терминалы, SSH и т.п.)
  • Load average: это среднее количество процессов, находящихся в состоянии выполнения или ожидающих выполнения (в очереди на CPU или I/O) за последние 1, 5 и 15 минут, также учитывает активность дискового ввода-вывода. Значение зависит от количества ядер CPU.
  • Tasks: Общее количество процессов, количество запущенных, спящих, остановленных и зомби-процессов.
  • %Cpu(s): Процент использования ЦП в различных состояниях (пользовательские процессы, системные процессы, ожидание ввода-вывода и т. д.).
  • MiB Mem: Информация об использовании физической памяти (всего, свободно, использовано, кэш).
  • MiB Swap: Информация об использовании подкачки (swap).

Управление в top:

КлавишаДействие
qВыход
kОтправить сигнал (по умолчанию SIGTERM)
rИзменить приоритет (renice)
PСортировка по CPU
MСортировка по памяти
uФильтр по пользователю
1Показать загрузку по ядрам

🎯 htop — улучшенная версия top

htop — интерактивный монитор с цветами, прокруткой и мышью.

Преимущества htop:

  • Цветовая индикация
  • Возможность выделять процессы мышью
  • Прокрутка по горизонтали (видны полные команды)
  • Простое завершение процессов: выделить → F9 → выбрать сигнал
  • F4 — фильтр по имени
  • F6 — сортировка
  • F5 — древовидный вид

INFO

htop не всегда установлен по умолчанию.


⚰️ kill — завершение процессов

Команда kill отправляет сигналы процессу.

Основные сигналы

СигналЧислоОписание
SIGTERM15Вежливый запрос на завершение (по умолчанию)
SIGKILL9Принудительное завершение (нельзя перехватить)
SIGSTOP19Остановить процесс
SIGCONT18Продолжить выполнение
SIGHUP1Перечитать конфигурацию (часто используется в демонах)

Примеры

kill 1234                    # Отправить SIGTERM процессу с PID 1234
kill -9 1234                 # SIGKILL — "жёсткое" завершение
kill -15 1234                # Явное указание SIGTERM
kill -HUP $(pidof nginx)     # Перезагрузить конфиг Nginx

WARNING

Используйте SIGKILL только если SIGTERM не помогает.
Это может привести к потере данных.


🔧 systemd — управление службами

systemd — современный инициализатор и менеджер служб в большинстве дистрибутивов (Ubuntu, Debian, Fedora, CentOS, Arch).

Основные команды systemctl

systemctl status nginx       # Статус службы
systemctl start nginx        # Запустить
systemctl stop nginx         # Остановить
systemctl restart nginx      # Перезапустить
systemctl reload nginx       # Перезагрузить конфиг (без остановки)
systemctl enable nginx       # Включить автозапуск при загрузке
systemctl disable nginx      # Отключить автозапуск
systemctl is-active nginx    # Проверить, работает ли
systemctl is-enabled nginx   # Проверить, включён ли автозапуск

Просмотр всех служб

systemctl list-units --type=service --state=active
systemctl list-unit-files --type=service | grep enabled

Журналы через journalctl

journalctl -u nginx.service           # Логи службы nginx
journalctl -u nginx.service -f        # Следить за логами в реальном времени
journalctl --since "2 hours ago"
journalctl -b                         # Логи текущей загрузки
journalctl -p err..alert              # Только ошибки

📕Дополнительные концепции и инструменты

Приоритизация процессов (nice и renice):

Ядро Linux распределяет процессорное время между процессами, учитывая их приоритет. Приоритет процесса находится в диапазоне от -20 (самый высокий) до 19 (самый низкий), по умолчанию устанавливается 0.

  • nice -n 5 command: Запустить команду с указанным приоритетом (например, 5).
  • renice 7 -p PID: Изменить приоритет уже запущенного процесса на 7.
    • Только суперпользователь может устанавливать более высокие приоритеты (меньшие числовые значения).

Контрольные группы (cgroups):

Механизм cgroups позволяет группировать процессы и ограничивать их потребление системных ресурсов (ЦП, память, ввод-вывод). Это особенно важно в средах виртуализации, облачных вычислениях и при работе с контейнерами. systemd использует cgroups для управления ресурсами служб и пользовательских сессий. Администраторы могут устанавливать правила, например, ограничивая объем памяти, доступной определенным приложениям или виртуальным машинам.

Пространства имен (Namespaces):

Пространства имен — это функция ядра Linux, которая обеспечивает изоляцию процессов, предоставляя каждому процессу (или группе процессов) собственный взгляд на системные ресурсы, такие как PID, сетевые интерфейсы, точки монтирования и пользователи. Эта изоляция является фундаментальной для работы контейнеров.

  • В контейнере PID 1 является первым процессом внутри него, а не процесс инициализации хоста.
  • Проект Linux Containers (LXC), начавшийся в Google в 2006 году, использовал пространства имен и другие функции ядра для создания и запуска Linux-контейнеров. Первые версии Docker были, по сути, удобными обёртками, упрощающими работу с LXC.

🧪 Практические примеры

Пример 1: Найти и убить процесс по имени

# Найти PID
ps aux | grep firefox
# Завершить
kill 1234
# Или одной командой
pkill firefox

TIP

pkill и pgrep — удобные утилиты:

pgrep nginx        # Показать PID nginx
pkill -f "python app.py"  # Убить по полной команде

Пример 2: Диагностика “подвисшего” сервера

# 1. Посмотреть загрузку
top
 
# 2. Найти "жадный" процесс
ps aux --sort=-%cpu | head -10
 
# 3. Проверить службу
systemctl status myapp
 
# 4. Перезапустить
sudo systemctl restart myapp
 
# 5. Проверить логи
journalctl -u myapp -f

⚠️ Типичные ошибки

ОшибкаКак исправить
kill: operation not permittedНет прав. Используйте sudo или убедитесь, что процесс ваш
systemctl: command not foundСистема использует SysVinit (редко). Или systemd не установлен
htop: command not foundУстановите: sudo apt install htop
Процесс в состоянии D (uninterruptible sleep)Обычно ждёт I/O. Нельзя убить SIGKILL. Ждать или перезагрузить
Много зомби-процессов (Z)Родитель не вызывает wait(). Требует исправления ПО

📊 Полезные команды диагностики

watch -n 1 'ps aux --sort=-%mem | head -15'   # Каждую секунду — топ по памяти
lsof -p 1234                                  # Какие файлы открыты процессом
strace -p 1234                                # Системные вызовы процесса (для отладки)
kill -l                                       # Список всех сигналов

✅ Заключение

Теперь вы можете:

  • Просматривать процессы с помощью ps, top, htop
  • Завершать процессы корректно и принудительно
  • Управлять службами через systemd
  • Анализировать логи и диагностировать проблемы