Эта статья — часть серии Linux administration, посвящённой самостоятельному администрированию Linux, Self-Hosting и DevOps. Управление процессами — ключ к стабильности, производительности и диагностике проблем.
📌 О чём эта статья?
Процесс — это запущенная программа. В любой момент в Linux работает десятки, а то и сотни процессов: от ядра до веб-сервера и вашего терминала.
В этой статье вы научитесь:
Просматривать запущенные процессы (ps, top, htop)
Анализировать потребление ресурсов
Управлять процессами вручную (kill, сигналы)
Работать с системными службами через systemd
Диагностировать “подвисшие” или “жадные” процессы
🧩 Что такое процесс в Linux?
Процесс — это запущенный экземпляр программы. У каждого процесса есть:
Особое значение имеет процесс с 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 COMMANDroot 1 0.0 0.3 169408 13024 ? Ss Mar20 0:15 /sbin/initalice 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().
Если родительский процесс не делает этого (например, содержит баг), можно:
Перезапустить родительский процесс — тогда зомби будут унаследованы процессом init (PID 1), который автоматически вызывает wait() и «убирает» зомби.
Убить родительский процесс — тогда зомби станут дочерними для 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 — интерактивный монитор с цветами, прокруткой и мышью.
journalctl -u nginx.service # Логи службы nginxjournalctl -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: Найти и убить процесс по имени
# Найти PIDps aux | grep firefox# Завершитьkill 1234# Или одной командойpkill firefox
TIP
pkill и pgrep — удобные утилиты:
pgrep nginx # Показать PID nginxpkill -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 # Список всех сигналов