Вопрос или проблема
Как я могу выполнить команду в bash, чтобы завершить все python-скрипты, кроме скрипта с именем test.py
и самого pid grep
, в случае если мы используем что-то вроде ps -ef |grep
Я думаю, что могу использовать что-то вроде pgrep python, чтобы проигнорировать процесс grep, но как мне также исключить скрипт test.py? Я знаю, что есть опция grep -v
, есть ли опция pgrep -v
Разъяснение: исключить процесс grep – означает, что когда мы, например, выполняем ps -ef |grep test1.py
, мы получаем также pid grep, который используется для получения этого результата. Я не хочу его завершать, так как этот процесс больше не существует на этапе, когда результаты отображаются.
Вы можете использовать что-то вроде этого:
pkill $(pgrep python | grep -xv $(pgrep test.py))
Работая изнутри наружу, это:
- собирает PID для test.py с помощью
pgrep test.py
- отправляет этот PID в
grep -xv
, который исключит его (-v
; опция-x
говорит о том, чтобы сопоставить всю строку (PID)) из списка, собранного с помощью: pgrep python
, чтобы собрать список python-скриптов, которые вы хотите завершить
Вам может понадобиться подкорректировать pgrep, чтобы точно найти нужные вам python-процессы, но это основная структура. Настройте это под свою ситуацию, снова работая изнутри наружу:
-
выполните
pgrep test.py
, чтобы убедиться, что он находит именно тот PID, который вы ожидаете. Изучите опциюpgrep -f
, чтобы сопоставить полное имя процесса для большей уверенности. -
выполните
pgrep python
(или подобное), чтобы найти “python-скрипты”, которые вы хотите завершить. -
соберите все вместе!
Общий совет по использованию ps
с grep
: обычный случай, когда вы не хотите, чтобы командная строка grep
была сопоставлена:
ps -ef | grep '[t]est'
Сопоставит test
в командных строках, но test
сам не появится в командной строке grep
.
получение PID
ps -eo pid,comm | awk 'NF==2 && $2~"\\.py$" && $2!="test.py" { printf "%d ",$1; }'
Я только что понял, что это работает для имен файлов до 16 символов.
Ответ или решение
Чтобы убить все процессы Python, кроме скрипта test.py
и самого процесса grep
, можно применить команду в оболочке bash, которая использует утилиты pgrep
и pkill
. Ниже приведены шаги с пояснением, как это сделать.
Шаги для завершения процессов:
-
Получение идентификатора (PID) для
test.py
:
Используем командуpgrep test.py
, чтобы получить PID для запущенного скрипта. Эта команда вернет идентификатор процесса, который можно будет использовать в дальнейшем. -
Использование команды
pgrep
для поиска всех процессов Python:
Мы воспользуемсяpgrep python
, чтобы получить список всех идентификаторов процессов, связанных с Python. -
Исключение ненужных процессов:
Мы хотим исключить PID дляtest.py
и также PID процессаgrep
, который мы запустили для поиска. Для этого можно использоватьgrep -v
для фильтрации результатов.
Объединение команд:
Вот как можно записать окончательную команду для выполнения указанных действий:
pkill -f python | grep -v $(pgrep test.py) | grep -v $$
Пояснение команды:
-
pkill -f python
: эта команда отправляет сигнал завершения всем процессам с именем процесса, содержащим "python". Флаг-f
позволяет искать по всей строке команды, что помогает избежать путаницы с различными версиями Python. -
grep -v $(pgrep test.py)
: этот фильтр исключает PID, который соответствуетtest.py
, из списка процессов, готовых к завершению. Командаpgrep test.py
возвращает PID, который затем передается вgrep -v
для фильтрации. -
grep -v $$
: здесь$$
возвращает PID текущего шелла, который также будет игнорироваться, чтобы избежать завершения самого процессаgrep
.
Дополнительные советы:
-
Проверка процессов: Перед выполнением команды для завершения процессов, всегда полезно сначала проверить, какие процессы будут затронуты. Это можно сделать, выполнив команду:
pgrep python | grep -v $(pgrep test.py) | grep -v $$
-
При необходимости, используйте
pgrep -f
: Если ваши процессы Python могут иметь одинаковые имена, стоит использоватьpgrep -f
для более точного поиска по полному имени и аргументам запуска. -
Запускайте команду с осторожностью: Убедитесь, что вы точно знаете, какие процессы вы собираетесь завершить, чтобы не закрыть важные службы или задачи.
Заключение:
Используя описанные выше методы и команды, вы сможете эффективно управлять процессами Python в вашей системе, исключая при этом определенные сценарии, такие как test.py
и сам процесс grep
. Это решение подходит для ситуаций, когда необходимо поддерживать контроль над выполняемыми процессами и избегать случайных завершений критически важных задач.