Убить процесс по PID одной Bash-командой с regex регулярных
Изучите несколько способов завершения процессов по PID в одной Bash-команде с использованием регулярных выражений. Узнайте о killall, pkill, pgrep и пайплайнах.
Как можно завершить процесс, автоматически извлекая его PID в одной команде bash с использованием регулярных выражений? Сейчас я использую ps aux | grep 'python csp_build.py' для поиска процесса, а затем вручную извлекаю PID и запускаю kill <pid>. Я хочу объединить эти шаги в одну команду, которая автоматически определит и завершит целевой процесс.
Вы можете завершить процесс, автоматически извлекая его PID одной командой Bash, используя несколько разных подходов. Ниже приведены самые эффективные методы:
Использование killall с поддержкой регулярных выражений:
killall --regexp 'python csp_build.py'
или более короткая версия:
killall -r 'python csp_build.py'
Использование pkill с поиском по всей командной строке:
pkill -f 'python csp_build.py'
Использование pgrep для поиска PID и их завершения:
kill $(pgrep -f 'python csp_build.py')
Использование конвейера с ps, grep, awk и xargs:
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 с регулярным выражением
killall -r 'python.*csp_build\.py'
Преимущества:
- Самый простой синтаксис
- Встроенная поддержка регулярных выражений
- Работает на большинстве дистрибутивов Linux
Ограничения:
- Некоторые реализации могут не поддерживать регулярные выражения
- Может потребоваться другой синтаксис на некоторых системах
Метод 2: Использование pkill с полным совпадением команды
pkill -f 'python.*csp_build\.py'
Преимущества:
- Ищет во всей командной строке, а не только в именах процессов
- Более надёжно для точных совпадений
- Доступен на большинстве современных систем Linux
Метод 3: Использование pgrep для извлечения PID
kill $(pgrep -f 'python.*csp_build\.py')
Преимущества:
- Явное извлечение PID
- Лёгко изменить сигнал, который отправляется
- Может комбинироваться с другими командами
Продвинутые техники и лучшие практики
Комбинирование нескольких шаблонов
killall -r 'python.*csp_build\.py|python.*build.*script'
Сравнение без учёта регистра
pkill -if 'python.*csp_build\.py'
Несколько вариантов сигналов
kill -15 $(pgrep -f 'python.*csp_build\.py') # SIGTERM (мягко)
kill -9 $(pgrep -f 'python.*csp_build\.py') # SIGKILL (жёстко)
Предотвращение появления grep в результатах
Умный трюк, чтобы избежать появления процесса grep в собственных результатах:
ps aux | grep -E '[p]ython.*csp_build\.py' | awk '{print $2}' | xargs kill -9
Меры предосторожности и тестирование
Тестирование без выполнения
Перед фактическим завершением процессов вы можете протестировать команду безопасными сигналами:
# Тест с SIGCONT (безопасно)
killall -s SIGCONT -r 'python.*csp_build\.py'
# Или использовать pgrep, чтобы увидеть, что будет убито
pgrep -f 'python.*csp_build\.py'
Команды проверки
Проверьте, что будет убито, прежде чем выполнять:
# Показать процессы, которые будут убиты
ps aux | grep -E 'python.*csp_build\.py' | grep -v grep
# Показать PID, которые будут убиты
pgrep -f 'python.*csp_build\.py'
Подтверждение вручную
Для важных систем добавьте подтверждение:
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
Обработка особых случаев
Процессы с сложными шаблонами
Для процессов, содержащих специальные символы или сложные шаблоны регулярных выражений:
# Правильно экранируйте специальные символы
killall -r 'python.*csp_build\.py\$'
Шаблоны с несколькими словами
Для шаблонов с пробелами или несколькими словами:
# Используйте кавычки, чтобы сохранить пробелы
pkill -f 'python.*csp build.*py'
Процессы конкретного пользователя
Чтобы убить только процессы конкретного пользователя:
killall -u username -r 'python.*csp_build\.py'
Группы процессов
При работе с группами процессов:
killall -g -r 'python.*csp_build\.py'
Заключение
-
Для большинства случаев используйте
pkill -f 'python.*csp_build\.py', поскольку это самый надёжный и лаконичный способ завершения процессов по полной командной строке. -
Для точного совпадения регулярного выражения
killall -r 'pattern'обеспечивает отличную поддержку регулярных выражений, но может отличаться между дистрибутивами Linux. -
Для максимального контроля подход с конвейером
ps aux | grep -E 'pattern' | grep -v grep | awk '{print $2}' | xargs kill -9даёт видимость того, что убивается. -
Всегда тестируйте свои шаблоны регулярных выражений с
pgrep -f 'pattern', прежде чем фактически завершать процессы, чтобы убедиться, что вы целитесь в нужные. -
Начинайте с SIGTERM (kill -15) для мягкого завершения, и используйте SIGKILL (kill -9) только в крайнем случае, когда процессы не реагируют на запросы завершения.
Эти методы значительно ускорят ваш процесс управления, избавив от необходимости вручную извлекать PID и обеспечив точный контроль над тем, какие процессы завершать.
Источники
- Find and kill a process in one line using bash and regex - Stack Overflow
- How to kill all processes with a given partial name? - Stack Overflow
- killall(1): kill processes by name - Linux man page
- How to kill all process with given name? - Unix & Linux Stack Exchange
- Search and Kill Processes With One Line [Command Line] – VPS.NET Blog
- Remove grep command while grepping using ps command - nixCraft