Убийство всех python-скриптов, кроме процесса grep и одного конкретного python-скрипта

Вопрос или проблема

Как я могу выполнить команду в 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))

Работая изнутри наружу, это:

  1. собирает PID для test.py с помощью pgrep test.py
  2. отправляет этот PID в grep -xv, который исключит его (-v; опция -x говорит о том, чтобы сопоставить всю строку (PID)) из списка, собранного с помощью:
  3. pgrep python, чтобы собрать список python-скриптов, которые вы хотите завершить

Вам может понадобиться подкорректировать pgrep, чтобы точно найти нужные вам python-процессы, но это основная структура. Настройте это под свою ситуацию, снова работая изнутри наружу:

  1. выполните pgrep test.py, чтобы убедиться, что он находит именно тот PID, который вы ожидаете. Изучите опцию pgrep -f, чтобы сопоставить полное имя процесса для большей уверенности.

  2. выполните pgrep python (или подобное), чтобы найти “python-скрипты”, которые вы хотите завершить.

  3. соберите все вместе!

Общий совет по использованию 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. Ниже приведены шаги с пояснением, как это сделать.

Шаги для завершения процессов:

  1. Получение идентификатора (PID) для test.py:
    Используем команду pgrep test.py, чтобы получить PID для запущенного скрипта. Эта команда вернет идентификатор процесса, который можно будет использовать в дальнейшем.

  2. Использование команды pgrep для поиска всех процессов Python:
    Мы воспользуемся pgrep python, чтобы получить список всех идентификаторов процессов, связанных с Python.

  3. Исключение ненужных процессов:
    Мы хотим исключить 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. Это решение подходит для ситуаций, когда необходимо поддерживать контроль над выполняемыми процессами и избегать случайных завершений критически важных задач.

Оцените материал
Добавить комментарий

Капча загружается...