Как убить все процессы с заданным частичным именем?

Я хочу убить все процессы, которые получаю:

ps aux | grep my_pattern

Как это сделать?

Это не работает:

pkill my_pattern

Ответ 1

Используйте pkill -f, который соответствует шаблону для любой части командной строки

pkill -f my_pattern

Ответ 2

Убить все процессы, соответствующие строке "myProcessName":

ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9

Источник: http://www.commandlinefu.com/commands/view/1138/ps-ef-grep-process-grep-v-grep-awk-print-2-xargs-kill-9

Что делает этот код?

ps -ef создает список идентификаторов процесса на компьютере, видимом для этого пользователя. Инструмент труба grep фильтрует это для строк, содержащих эту строку. grep -v grep говорит, что не совпадает с процессом, выполняющим поиск. Канал awk print говорит, что разделяет строки в пробелах по умолчанию и фильтрует их во второй столбец, который является нашим идентификатором процесса. Канал xargs запускает новый процесс, чтобы отправить все эти pid, чтобы kill -9, завершив их все.

Код выше плохой, опасный, безобразный и хакерский по нескольким причинам.

  1. Если принудительно завершающий код выполняет какие-либо операции с базами данных или защищенные транзакции с малой вероятностью состязания, то через некоторое время атомарность этой транзакции будет нарушена, что приведет к неопределенному поведению. убить -9 не берет пленных. Если ваш код чувствителен к этому, попробуйте заменить xargs kill передаваемым флагом, который запрашивает xargs kill завершение работы, и только если этот запрос отклонен, в крайнем случае kill -9

  2. Существует ненулевая вероятность того, что вы случайно завершите работу операционной системы или вызвали неопределенное поведение в несвязанном процессе, что приведет к нестабильности всей системы, потому что ps -ef перечисляет все возможные процессы, которые могут существовать, и вы не можете быть уверены, что какой-то странный третий Библиотека party публикует имя вашего процесса или то, что в промежутке между чтением и выполнением kill -9 процесс изменился на что-то другое, и теперь вы случайно завершили какой-то случайный процесс, который вы не собирались.

Но если вы понимаете риски и контролируете их с очень уникальными именами, и у вас все в порядке с несколькими сброшенными транзакциями или случайным повреждением данных, то в 99,9% случаев все будет в порядке. Если возникла проблема, перезагрузите компьютер, убедитесь, что нет конфликтов процессов. Именно из-за кода, подобного этому, сценарий технической поддержки: "Вы пытались перезагрузить компьютер" мем 5-го уровня.

Ответ 3

Если вам нужна большая гибкость при выборе процессов, используйте

for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do 
  kill -9 $KILLPID;
done

Вы можете использовать grep -e и т.д.

Ответ 4

вы можете использовать следующую команду для перечисления процесса

ps aux | grep -c myProcessName 

если вам нужно проверить счетчик этого процесса, запустите

ps aux | grep -c myProcessName |grep -v grep 

после чего вы можете убить процесс, используя

kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }') 

Ответ 5

Также вы можете использовать killall -r my_pattern. -r Интерпретировать шаблон имени процесса как расширенное регулярное выражение.

killall -r my_pattern

Ответ 6

Если вы pkill -f PATTERN слишком опасен, я написал ezkill bash-скрипт, который предложит вам выбрать, какие процессы среди тех, которые соответствуют PATTERN, вы хотите уничтожить.

Ответ 7

Вы можете использовать следующую команду для

kill -9 $(ps aux | grep 'process' | grep -v 'grep' | awk '{print $2}')

Ответ 8

Если вы не хотите испытывать головную боль при поиске идентификатора процесса, используйте regexp для уничтожения процесса по имени. Например, чтобы убить Chrome, следующий код сделает свое дело.

killall -r --regexp chrome

Ответ 9

Вы можете использовать следующую команду для:

ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9

или

ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9

Это работает для меня.

Ответ 10

Звучит плохо?

 pkill `pidof myprocess`

Пример:

# kill all java processes
pkill `pidof java`

Ответ 11

это лучше и безопаснее использовать pgrep -f с kill или просто pkill -f, grep Инг ps выход может пойти не так.

В отличие от использования ps | grep ps | grep с помощью которого вам нужно отфильтровать строку grep, добавив | grep -v | grep -v или используя трюки с шаблонами, pgrep просто не выберет сам себя.

Более того, если ваш шаблон появится в ps UID/USER, SDATE/START или любом другом столбце, вы получите нежелательные процессы в выводе и убьете их, pgrep + pkill не страдает от этого недостатка.

Также я обнаружил, что killall -r / -regexp не работал с моим регулярным выражением.

pkill -f "^python3 path/to/my_script$"

man pkill

Ответ 12

Нашел лучший способ сделать это для сервера, который не поддерживает ' pkill '

" kill -9 $ (ps ax | grep My_pattern | fgrep -v grep | awk '{print $ 1}') "

Вы не должны зацикливаться.