Другое

Полное руководство: Удаление процессов по частичному имени

Узнайте, как завершить все процессы по частичному имени с помощью pkill -f, pgrep + kill. Полное руководство с советами по безопасности для Linux/Unix и

Как убить все процессы, имя которых содержит заданную часть?

Я хочу завершить все процессы, которые получаю, выполнив:

ps aux | grep my_pattern

Как это можно сделать?

Я пробовал использовать:

pkill my_pattern

но это не работает как ожидалось.

Надёжнейший способ завершить все процессы с заданным частичным именем — использовать pkill -f my_pattern. Опция -f заставляет pkill сопоставлять шаблон со всей командной строкой, включая аргументы, а не только с именем процесса, что критично, если ваш шаблон встречается в любой части команды.

Содержание

Понимание проблемы

Когда вы запускаете ps aux | grep my_pattern, вы получаете список процессов, содержащих «my_pattern» в командной строке. Однако у этого подхода есть проблемы:

  1. В выводе появляется сама команда grep.
  2. Сравнение только по имени процесса (без аргументов) может не найти все процессы.
  3. Нужно вручную извлекать PID и затем завершать процессы.

Проблема с pkill my_pattern без -f в том, что он сопоставляет только имя процесса (первое слово команды), а не всю командную строку с аргументами. Поэтому он может не найти ожидаемые процессы.

Лучшее решение: pkill -f

Самый прямой и эффективный способ — использовать pkill с опцией -f:

bash
pkill -f my_pattern

Согласно Unix & Linux Stack Exchange, «с опцией -f вся командная строка (включая аргументы) будет учитываться. Без -f учитывается только имя команды».

Флаг -f заставляет pkill искать шаблон во всей строке команды, что именно нужно при работе с частичными совпадениями.

Пример:

bash
# Завершить все процессы, содержащие «chrome» в любой части команды
pkill -f chrome

# Завершить все процессы, содержащие «python script.py»
pkill -f "python script.py"

Если процессы не завершаются корректно, можно принудительно завершить их сигналом 9:

bash
pkill -9 -f my_pattern

Более безопасный вариант: pgrep + kill

Для большего контроля и безопасности рекомендуется сначала определить, какие процессы будут завершены, используя pgrep, а затем выполнить команду kill. Это подход, рекомендованный экспертами Stack Overflow как «лучший и самый безопасный»:

bash
# Сначала посмотрите, какие процессы будут завершены
pgrep -f my_pattern

# Если вывод выглядит корректно, завершите их
kill $(pgrep -f my_pattern)

# Или принудительно завершите с сигналом 9
kill -9 $(pgrep -f my_pattern)

Пример с проверкой:

bash
# Шаг 1: Список процессов, которые будут завершены
echo "Процессы, которые будут завершены:"
pgrep -f my_pattern

# Шаг 2: Подтверждение и выполнение
echo "Завершаем процессы..."
kill -9 $(pgrep -f my_pattern)

Этот подход безопаснее, потому что вы можете просмотреть PID перед фактическим завершением процессов.

Традиционный метод: ps + grep + awk + kill

Традиционный метод с ps | grep более сложен, но даёт полный контроль. Нужно отфильтровать сам процесс grep и извлечь PID:

bash
ps aux | grep my_pattern | grep -v grep | awk '{print $2}' | xargs kill

Разбор:

  • ps aux – выводит список всех процессов
  • grep my_pattern – фильтрует по вашему шаблону
  • grep -v grep – исключает сам процесс grep
  • awk '{print $2}' – извлекает PID (вторая колонка)
  • xargs kill – отправляет сигнал завершения всем PID

Для принудительного завершения:

bash
ps aux | grep my_pattern | grep -v grep | awk '{print $2}' | xargs kill -9

Согласно Ask Ubuntu, «pgrep и pkill – это инструменты для этого», а традиционный метод более склонен к ошибкам.

Продвинутые техники и параметры

Использование команды killall

Команда killall также может использоваться с флагом -i (интерактивный режим):

bash
killall -i my_pattern

Она запросит подтверждение перед завершением каждого процесса.

Комбинирование с другими параметрами

Вы можете комбинировать pkill с различными опциями для более точного контроля:

bash
# Завершить процессы конкретного пользователя
pkill -u username -f my_pattern

# Завершить процессы в конкретном терминале
pkill -t pts/0 -f my_pattern

# Завершить процессы по ID группы
pkill -g 1234 -f my_pattern

Несколько шаблонов

Чтобы завершить процессы, соответствующие нескольким шаблонам:

bash
# Завершить процессы, содержащие любой из шаблонов
pkill -f -e "pattern1|pattern2"

Меры предосторожности и лучшие практики

Всегда проверяйте сначала

Перед завершением критических процессов всегда проверяйте, что вы собираетесь завершить:

bash
# «Сухой» запуск – просто список процессов, которые будут завершены
pgrep -f my_pattern

Используйте сигналы правильно

  • kill (SIGTERM) – позволяет процессу корректно завершиться (по умолчанию)
  • kill -9 (SIGKILL) – немедленное завершение, не перехватываемое

Сначала используйте SIGTERM, а SIGKILL применяйте только при необходимости.

Будьте осторожны с привилегиями root

Некоторые процессы могут требовать sudo для завершения:

bash
sudo pkill -f my_pattern

Обрабатывайте специальные символы в шаблонах

Если ваш шаблон содержит специальные символы, экранируйте его:

bash
pkill -f "my pattern with spaces"
pkill -f 'pattern*with*wildcards'

Распространённые ошибки и решения

Проблема: pkill не находит мои процессы

Решение: вероятно, вам нужен флаг -f для поиска по всей командной строке.

Проблема: pkill завершает сам себя

Решение: это не должно происходить с современными реализациями pkill. Если всё же, используйте подход pgrep + kill.

Проблема: процессы не завершаются

Решение: используйте сигнал 9 для принудительного завершения: pkill -9 -f my_pattern.

Проблема: завершаются слишком много процессов

Решение: уточните шаблон или добавьте дополнительные фильтры, например, пользователя или терминал.


Источники

  1. Unix & Linux Stack Exchange – Как завершить все процессы с заданным именем?
  2. Stack Overflow – Как завершить все процессы с заданным частичным именем?
  3. GeeksforGeeks – Как завершить процессы по частичному имени в Linux
  4. Ask Ubuntu – Завершение нескольких процессов по имени
  5. SS64 – Страница man pkill
  6. Linuxize – Команда pkill в Linux

Заключение

Чтобы завершить все процессы с заданным частичным именем, используйте pkill -f my_pattern как основной метод. Он эффективен, надёжен и специально предназначен для этой задачи. Для более безопасных операций сначала используйте pgrep -f my_pattern для проверки, что будет завершено, а затем выполните kill $(pgrep -f my_pattern).

Ключевые моменты:

  • Всегда используйте флаг -f с pkill для частичного совпадения имени.
  • Проверяйте процессы перед завершением в продакшн‑окружениях.
  • Начинайте с SIGTERM, применяйте SIGKILL только при необходимости.
  • Будьте осторожны с правами root и специальными символами в шаблонах.

Традиционный метод ps | grep | awk | kill работает, но более склонен к ошибкам и менее эффективен, чем специализированные инструменты pkill/pgrep. Для большинства случаев pkill -f обеспечивает самый простой и надёжный способ.

Авторы
Проверено модерацией
Модерация