Руководство по управлению процессами Linux с помощью 'ps' и 'kill'

Узнайте, как просматривать процессы Linux с помощью `ps`, читать ключевые столбцы и безопасно останавливать процессы с помощью `kill`, `pkill` и `killall`.

Руководство по управлению процессами в Linux с помощью 'ps' и 'kill'

Управление процессами Linux — это повседневный навык устранения неполадок. Когда приложение зависает, задача резервного копирования потребляет ресурсы процессора или демону требуется чистый перезапуск, ps помогает найти процесс, а kill позволяет отправить ему правильный сигнал.

Каждая запущенная программа имеет идентификатор процесса, или PID. Зная этот PID, вы можете проверить владельца, родительские процессы, использование ЦП и памяти, а также решить, попросить процесс остановиться корректно или принудительно завершить его в крайнем случае.

Модель процессов Linux: PID и состояния

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

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

Просмотр процессов с помощью команды ps

Команда ps (статус процесса) используется для отображения информации о текущих запущенных процессах. Поскольку вывод может быть перегружен, используются различные параметры для выбора отображаемых процессов и включаемых столбцов информации.

Основной синтаксис и флаги ps

Существует два основных стиля флагов ps: стиль Unix (с префиксом -) и стиль BSD (без префикса). Современная практика часто отдает предпочтение комбинации флагов Unix-стиля для получения всестороннего представления.

1. Просмотр всех процессов (стиль BSD)

Наиболее распространенная команда для общего обзора системы — ps aux.

  • a: Показать процессы для всех пользователей.
  • u: Отображать процессы в ориентированном на пользователя формате (показывая пользователя, использование ЦП, использование памяти и т.д.).
  • x: Включить процессы, не имеющие управляющего терминала (например, фоновые демоны).
ps aux

2. Просмотр процессов в стандартном формате (стиль UNIX)

Команда ps -ef предоставляет полный список в формате POSIX.

  • -e: Выбрать все процессы.
  • -f: Отобразить полный формат списка, включая PPID и аргументы команды.
ps -ef

Интерпретация ключевых столбцов вывода

Независимо от используемых флагов, некоторые столбцы критически важны для управления процессами:

Столбец Описание
PID Идентификатор процесса (уникальный идентификатор)
PPID Идентификатор родительского процесса (PID процесса, запустившего этот)
USER Пользователь, владеющий процессом
%CPU Процент используемого времени ЦП
%MEM Процент используемой физической памяти
VSZ Размер виртуальной памяти (в КиБ)
RSS Размер резидентного набора (используемая физическая память, в КиБ)
STAT Текущее состояние процесса (например, R=Выполняется, S=Спит, Z=Зомби)
COMMAND Команда, запустившая процесс

Фильтрация процессов с помощью grep

Чтобы найти конкретный процесс, можно передать вывод ps в grep.

Например, этот поиск ищет процессы Apache httpd:

ps aux | grep httpd

Совет: ps | grep часто показывает сам процесс grep. Обозначение в скобках позволяет избежать этого лишнего совпадения:

ps aux | grep '[h]ttpd'

Управление процессами с помощью команды kill

Команда kill не просто останавливает процессы; она отправляет им сигналы. Поведение по умолчанию — запрос на корректное завершение, но другие сигналы могут указать процессу перечитать файлы конфигурации, временно приостановить выполнение или принудительно завершиться немедленно.

Понимание сигналов

Сигналы — это стандартизированные числовые или мнемонические коды. Вы можете вывести список доступных сигналов с помощью kill -l.

Имя сигнала Номер сигнала Описание
SIGTERM 15 Сигнал завершения по умолчанию. Просит процесс корректно завершить работу.
SIGKILL 9 Сигнал немедленного принудительного завершения. Процесс не может его игнорировать.
SIGHUP 1 Сигнал отбоя, часто используется демонами для перечитывания файлов конфигурации.
SIGSTOP Обычно 19 на x86 Linux Останавливает (приостанавливает) процесс без его завершения.
SIGCONT Обычно 18 на x86 Linux Возобновляет остановленный процесс.

Отправка сигналов с помощью kill

Базовый синтаксис команды kill:

kill -SIGNAL PID

1. Корректное завершение (лучшая практика)

Сначала попробуйте SIGTERM. Он дает приложению возможность сохранить состояние, закрыть файлы, завершить запросы и освободить блокировки.

kill 12345  # По умолчанию SIGTERM (15)
# ИЛИ
kill -15 12345

2. Принудительное завершение (крайняя мера)

Если процесс не отвечает и игнорирует SIGTERM, используйте SIGKILL (сигнал 9). Это останавливает процесс без очистки на уровне приложения. Это может привести к частичной записи, оставленным файлам блокировки или прерванным транзакциям в зависимости от того, что делал процесс.

kill -9 12345

Управление процессами по имени: pkill и killall

В то время как ps и kill полагаются на PID, иногда быстрее воздействовать на процессы по имени. Используйте эти команды с крайней осторожностью, так как они могут повлиять на несколько процессов одновременно.

killall

Завершает все процессы, соответствующие указанному точному имени процесса.

killall httpd  # Отправляет SIGTERM всем процессам с именем 'httpd'
killall -9 cron  # Принудительно убивает все процессы 'cron'

pkill

Позволяет использовать сопоставление с шаблоном (регулярные выражения) при выборе процессов для отправки сигнала, что обеспечивает большую гибкость, чем killall.

# Убивает любой процесс, полная командная строка которого содержит 'firefox'
pkill -f firefox

Предупреждение о killall и pkill: Если вы случайно нацелитесь на критический системный процесс (например, init или systemd), вы можете дестабилизировать или обрушить всю операционную систему. Всегда проверяйте целевой PID с помощью ps перед использованием killall или pkill с широкими шаблонами.

Безопасный рабочий процесс управления процессами

При устранении неполадок с вышедшим из-под контроля приложением следуйте этому систематическому подходу:

  1. Идентификация: Используйте ps aux | grep <имя_процесса>, чтобы найти PID процесса и проверить его статус.
  2. Проверка состояния: Изучите столбец STAT. Если он Z, процесс уже мертв; вам нужно, чтобы родительский процесс подобрал его. Проверьте PPID перед тем, как что-либо убивать.
  3. Попытка корректной остановки: Отправьте SIGTERM (по умолчанию kill PID). Подождите несколько секунд.
  4. Проверка остановки: Снова выполните ps.
  5. Принудительная остановка при необходимости: Если процесс продолжает существовать и вы понимаете риск, отправьте SIGKILL с помощью kill -9 PID.

Практическая привычка проста: определите PID, проверьте владельца и состояние, отправьте самый щадящий полезный сигнал, затем проверьте результат. Это делает очистку процессов предсказуемой и снижает вероятность остановки не той рабочей нагрузки.