Полное руководство: Удаление процессов по частичному имени
Узнайте, как завершить все процессы по частичному имени с помощью pkill -f, pgrep + kill. Полное руководство с советами по безопасности для Linux/Unix и
Как убить все процессы, имя которых содержит заданную часть?
Я хочу завершить все процессы, которые получаю, выполнив:
ps aux | grep my_pattern
Как это можно сделать?
Я пробовал использовать:
pkill my_pattern
но это не работает как ожидалось.
Надёжнейший способ завершить все процессы с заданным частичным именем — использовать pkill -f my_pattern. Опция -f заставляет pkill сопоставлять шаблон со всей командной строкой, включая аргументы, а не только с именем процесса, что критично, если ваш шаблон встречается в любой части команды.
Содержание
- Понимание проблемы
- Лучшее решение: pkill -f
- Более безопасный вариант: pgrep + kill
- Традиционный метод: ps + grep + awk + kill
- Продвинутые техники и параметры
- Меры предосторожности и лучшие практики
- Распространённые ошибки и решения
Понимание проблемы
Когда вы запускаете ps aux | grep my_pattern, вы получаете список процессов, содержащих «my_pattern» в командной строке. Однако у этого подхода есть проблемы:
- В выводе появляется сама команда
grep. - Сравнение только по имени процесса (без аргументов) может не найти все процессы.
- Нужно вручную извлекать PID и затем завершать процессы.
Проблема с pkill my_pattern без -f в том, что он сопоставляет только имя процесса (первое слово команды), а не всю командную строку с аргументами. Поэтому он может не найти ожидаемые процессы.
Лучшее решение: pkill -f
Самый прямой и эффективный способ — использовать pkill с опцией -f:
pkill -f my_pattern
Согласно Unix & Linux Stack Exchange, «с опцией -f вся командная строка (включая аргументы) будет учитываться. Без -f учитывается только имя команды».
Флаг -f заставляет pkill искать шаблон во всей строке команды, что именно нужно при работе с частичными совпадениями.
Пример:
# Завершить все процессы, содержащие «chrome» в любой части команды
pkill -f chrome
# Завершить все процессы, содержащие «python script.py»
pkill -f "python script.py"
Если процессы не завершаются корректно, можно принудительно завершить их сигналом 9:
pkill -9 -f my_pattern
Более безопасный вариант: pgrep + kill
Для большего контроля и безопасности рекомендуется сначала определить, какие процессы будут завершены, используя pgrep, а затем выполнить команду kill. Это подход, рекомендованный экспертами Stack Overflow как «лучший и самый безопасный»:
# Сначала посмотрите, какие процессы будут завершены
pgrep -f my_pattern
# Если вывод выглядит корректно, завершите их
kill $(pgrep -f my_pattern)
# Или принудительно завершите с сигналом 9
kill -9 $(pgrep -f my_pattern)
Пример с проверкой:
# Шаг 1: Список процессов, которые будут завершены
echo "Процессы, которые будут завершены:"
pgrep -f my_pattern
# Шаг 2: Подтверждение и выполнение
echo "Завершаем процессы..."
kill -9 $(pgrep -f my_pattern)
Этот подход безопаснее, потому что вы можете просмотреть PID перед фактическим завершением процессов.
Традиционный метод: ps + grep + awk + kill
Традиционный метод с ps | grep более сложен, но даёт полный контроль. Нужно отфильтровать сам процесс grep и извлечь PID:
ps aux | grep my_pattern | grep -v grep | awk '{print $2}' | xargs kill
Разбор:
ps aux– выводит список всех процессовgrep my_pattern– фильтрует по вашему шаблонуgrep -v grep– исключает сам процессgrepawk '{print $2}'– извлекает PID (вторая колонка)xargs kill– отправляет сигнал завершения всем PID
Для принудительного завершения:
ps aux | grep my_pattern | grep -v grep | awk '{print $2}' | xargs kill -9
Согласно Ask Ubuntu, «pgrep и pkill – это инструменты для этого», а традиционный метод более склонен к ошибкам.
Продвинутые техники и параметры
Использование команды killall
Команда killall также может использоваться с флагом -i (интерактивный режим):
killall -i my_pattern
Она запросит подтверждение перед завершением каждого процесса.
Комбинирование с другими параметрами
Вы можете комбинировать pkill с различными опциями для более точного контроля:
# Завершить процессы конкретного пользователя
pkill -u username -f my_pattern
# Завершить процессы в конкретном терминале
pkill -t pts/0 -f my_pattern
# Завершить процессы по ID группы
pkill -g 1234 -f my_pattern
Несколько шаблонов
Чтобы завершить процессы, соответствующие нескольким шаблонам:
# Завершить процессы, содержащие любой из шаблонов
pkill -f -e "pattern1|pattern2"
Меры предосторожности и лучшие практики
Всегда проверяйте сначала
Перед завершением критических процессов всегда проверяйте, что вы собираетесь завершить:
# «Сухой» запуск – просто список процессов, которые будут завершены
pgrep -f my_pattern
Используйте сигналы правильно
kill(SIGTERM) – позволяет процессу корректно завершиться (по умолчанию)kill -9(SIGKILL) – немедленное завершение, не перехватываемое
Сначала используйте SIGTERM, а SIGKILL применяйте только при необходимости.
Будьте осторожны с привилегиями root
Некоторые процессы могут требовать sudo для завершения:
sudo pkill -f my_pattern
Обрабатывайте специальные символы в шаблонах
Если ваш шаблон содержит специальные символы, экранируйте его:
pkill -f "my pattern with spaces"
pkill -f 'pattern*with*wildcards'
Распространённые ошибки и решения
Проблема: pkill не находит мои процессы
Решение: вероятно, вам нужен флаг -f для поиска по всей командной строке.
Проблема: pkill завершает сам себя
Решение: это не должно происходить с современными реализациями pkill. Если всё же, используйте подход pgrep + kill.
Проблема: процессы не завершаются
Решение: используйте сигнал 9 для принудительного завершения: pkill -9 -f my_pattern.
Проблема: завершаются слишком много процессов
Решение: уточните шаблон или добавьте дополнительные фильтры, например, пользователя или терминал.
Источники
- Unix & Linux Stack Exchange – Как завершить все процессы с заданным именем?
- Stack Overflow – Как завершить все процессы с заданным частичным именем?
- GeeksforGeeks – Как завершить процессы по частичному имени в Linux
- Ask Ubuntu – Завершение нескольких процессов по имени
- SS64 – Страница man pkill
- 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 обеспечивает самый простой и надёжный способ.