Другое

Убить процесс по PID одной Bash-командой с regex регулярных

Изучите несколько способов завершения процессов по PID в одной Bash-команде с использованием регулярных выражений. Узнайте о killall, pkill, pgrep и пайплайнах.

Как можно завершить процесс, автоматически извлекая его PID в одной команде bash с использованием регулярных выражений? Сейчас я использую ps aux | grep 'python csp_build.py' для поиска процесса, а затем вручную извлекаю PID и запускаю kill <pid>. Я хочу объединить эти шаги в одну команду, которая автоматически определит и завершит целевой процесс.

Вы можете завершить процесс, автоматически извлекая его PID одной командой Bash, используя несколько разных подходов. Ниже приведены самые эффективные методы:

Использование killall с поддержкой регулярных выражений:

bash
killall --regexp 'python csp_build.py'

или более короткая версия:

bash
killall -r 'python csp_build.py'

Использование pkill с поиском по всей командной строке:

bash
pkill -f 'python csp_build.py'

Использование pgrep для поиска PID и их завершения:

bash
kill $(pgrep -f 'python csp_build.py')

Использование конвейера с ps, grep, awk и xargs:

bash
ps aux | grep -E 'python csp_build.py' | grep -v grep | awk '{print $2}' | xargs kill -9

Содержание


Понимание различных подходов

Команда killall

Команда killall специально предназначена для завершения процессов по имени и поддерживает регулярные выражения через флаг --regexp или -r. Согласно ману Linux, этот подход сопоставляет имена процессов с указанным шаблоном регулярного выражения.

Команда pkill

pkill похож на killall, но предлагает большую гибкость. С флагом -f она ищет совпадения во всей командной строке, что идеально подходит для вашего случая, когда нужно сопоставить всю команду python csp_build.py.

Команда pgrep

pgrep находит идентификаторы процессов, соответствующие шаблону. В сочетании с kill она создаёт мощный однострочник, сначала определяющий PID, а затем завершающий их.

Подход с конвейером

Традиционный подход с конвейером ps | grep | awk | xargs обеспечивает максимальный контроль и видимость процесса поиска и завершения процессов.


Метод 1: Использование killall с регулярным выражением

bash
killall -r 'python.*csp_build\.py'

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

  • Самый простой синтаксис
  • Встроенная поддержка регулярных выражений
  • Работает на большинстве дистрибутивов Linux

Ограничения:

  • Некоторые реализации могут не поддерживать регулярные выражения
  • Может потребоваться другой синтаксис на некоторых системах

Метод 2: Использование pkill с полным совпадением команды

bash
pkill -f 'python.*csp_build\.py'

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

  • Ищет во всей командной строке, а не только в именах процессов
  • Более надёжно для точных совпадений
  • Доступен на большинстве современных систем Linux

Метод 3: Использование pgrep для извлечения PID

bash
kill $(pgrep -f 'python.*csp_build\.py')

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

  • Явное извлечение PID
  • Лёгко изменить сигнал, который отправляется
  • Может комбинироваться с другими командами

Продвинутые техники и лучшие практики

Комбинирование нескольких шаблонов

bash
killall -r 'python.*csp_build\.py|python.*build.*script'

Сравнение без учёта регистра

bash
pkill -if 'python.*csp_build\.py'

Несколько вариантов сигналов

bash
kill -15 $(pgrep -f 'python.*csp_build\.py')  # SIGTERM (мягко)
kill -9 $(pgrep -f 'python.*csp_build\.py')   # SIGKILL (жёстко)

Предотвращение появления grep в результатах

Умный трюк, чтобы избежать появления процесса grep в собственных результатах:

bash
ps aux | grep -E '[p]ython.*csp_build\.py' | awk '{print $2}' | xargs kill -9

Меры предосторожности и тестирование

Тестирование без выполнения

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

bash
# Тест с SIGCONT (безопасно)
killall -s SIGCONT -r 'python.*csp_build\.py'

# Или использовать pgrep, чтобы увидеть, что будет убито
pgrep -f 'python.*csp_build\.py'

Команды проверки

Проверьте, что будет убито, прежде чем выполнять:

bash
# Показать процессы, которые будут убиты
ps aux | grep -E 'python.*csp_build\.py' | grep -v grep

# Показать PID, которые будут убиты
pgrep -f 'python.*csp_build\.py'

Подтверждение вручную

Для важных систем добавьте подтверждение:

bash
echo "Сейчас убиваем следующие процессы:"
pgrep -f 'python.*csp_build\.py'
read -p "Продолжить? (y/n) " answer
if [[ $answer == "y" ]]; then
    kill -9 $(pgrep -f 'python.*csp_build\.py')
fi

Обработка особых случаев

Процессы с сложными шаблонами

Для процессов, содержащих специальные символы или сложные шаблоны регулярных выражений:

bash
# Правильно экранируйте специальные символы
killall -r 'python.*csp_build\.py\$'

Шаблоны с несколькими словами

Для шаблонов с пробелами или несколькими словами:

bash
# Используйте кавычки, чтобы сохранить пробелы
pkill -f 'python.*csp build.*py'

Процессы конкретного пользователя

Чтобы убить только процессы конкретного пользователя:

bash
killall -u username -r 'python.*csp_build\.py'

Группы процессов

При работе с группами процессов:

bash
killall -g -r 'python.*csp_build\.py'

Заключение

  1. Для большинства случаев используйте pkill -f 'python.*csp_build\.py', поскольку это самый надёжный и лаконичный способ завершения процессов по полной командной строке.

  2. Для точного совпадения регулярного выражения killall -r 'pattern' обеспечивает отличную поддержку регулярных выражений, но может отличаться между дистрибутивами Linux.

  3. Для максимального контроля подход с конвейером ps aux | grep -E 'pattern' | grep -v grep | awk '{print $2}' | xargs kill -9 даёт видимость того, что убивается.

  4. Всегда тестируйте свои шаблоны регулярных выражений с pgrep -f 'pattern', прежде чем фактически завершать процессы, чтобы убедиться, что вы целитесь в нужные.

  5. Начинайте с SIGTERM (kill -15) для мягкого завершения, и используйте SIGKILL (kill -9) только в крайнем случае, когда процессы не реагируют на запросы завершения.

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

Источники

  1. Find and kill a process in one line using bash and regex - Stack Overflow
  2. How to kill all processes with a given partial name? - Stack Overflow
  3. killall(1): kill processes by name - Linux man page
  4. How to kill all process with given name? - Unix & Linux Stack Exchange
  5. Search and Kill Processes With One Line [Command Line] – VPS.NET Blog
  6. Remove grep command while grepping using ps command - nixCraft
Авторы
Проверено модерацией
Модерация