Как убить все процессы с заданным частичным именем? - PullRequest
520 голосов
/ 24 января 2012

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

ps aux | grep my_pattern

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

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

pkill my_pattern

Ответы [ 12 ]

1137 голосов
/ 24 января 2012

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

pkill -f my_pattern
122 голосов
/ 28 мая 2015

Убить все процессы, соответствующие строке «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 переданным флагом, который запрашивает постепенное завершение работы, и только в случае отклонения этого запроса в крайнем случае kill -9

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

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

50 голосов
/ 24 января 2012

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

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

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

16 голосов
/ 21 июня 2016

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

ps aux | grep -c myProcessName 

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

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

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

kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }') 
11 голосов
/ 26 сентября 2017

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

killall -r my_pattern
7 голосов
/ 30 марта 2017

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

5 голосов
/ 11 сентября 2017

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

kill -9 $(ps aux | grep 'process' | grep -v 'grep' | awk '{print $2}')
3 голосов
/ 16 февраля 2018

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

killall -r --regexp chrome

2 голосов
/ 08 сентября 2017

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

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

или

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

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

1 голос
/ 14 ноября 2016

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

 pkill `pidof myprocess`

пример:

# kill all java processes
pkill `pidof java`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...