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

623

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

ps aux | grep my_pattern

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

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

pkill my_pattern
Лукаш Лью
источник
11
Это my_patternпросто подстрока имени, или она содержит какие-либо специальные символы регулярных выражений?
Свен Марнач

Ответы:

1318

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

pkill -f my_pattern
Дор Шемер
источник
7
@Jayan: это также довольно неизбирательное убийство. Это удивительно легко неправильно ...
Thkala
1
@Jayan: ты не будешь убеждать меня :-). Меня слишком много раз сжигали сторонние скрипты, которые настаивали на использовании pkill- самая распространенная ошибка - предположение, что в любой момент времени может существовать только один экземпляр каждого двоичного файла.
Thkala
4
Для всех пользователей Mac, которые находят этот ответ, как и я, эквивалент для Mac есть killall -m my_pattern.
Зев Эйзенберг,
1
Если у вас есть несколько зависающих процессов, которые не будут убиты, используйте pkill -f -9, чтобы безжалостно убить их
MacK
18
Я рекомендую использовать pgrepсначала, чтобы проверить, что вы собираетесь убить. Вы можете использовать, pgrep -lчтобы увидеть имена процессов или pgrep -aувидеть полные командные строки. Он использует те же флаги, что и pkill. Так что в этом случае вы могли бы использовать pgrep -fa my_pattern.
Studgeek
158

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

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

Эрик Лещинский
источник
15
Это выдаст ошибку, если не найден процесс, соответствующий имени. Возможно, вы захотите использовать, ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9чтобы xargs не выполнял команду, если аргументы не указаны.
Epigene
2
Просто небольшая модификация, возможно, лучше процитировать имя процесса: ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9 без кавычек только один из моих фоновых процессов был убит при первом запуске. Запуск его снова убил остальных.
Али Хайдер
-rОпция не существует в OS X, так что кажется.
Даниэль
52

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

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

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

Евгений Рик
источник
4
-1 Вам не нужен цикл, вы можете просто kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`(обратите внимание также на рефакторинг; см. Также мой комментарий к ответу @ synthesizerpatel).
tripleee
11
@tripleee Нет проблем с downvote, но вы делаете Осознайте, что OQ был «Я хочу , чтобы убить все процессы , которые я получаю от: пс Окс | Grep my_pattern» , который я dutyfully согласился.
Евгений Рик,
Kill убьет все процессы за один раз, для этого вам не нужен цикл. Если psвозвращает три процесса 123, 234 и 345, вы можете kill 123 234 345точно так же, как вы можете rmили catнесколько аргументов файла.
tripleee
@tripleee Я собираюсь удалитьgrep
Eugen Rieck
for KILLPID in пс топор | греп "пума" | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; doneудалит grep
Джастин Э.
18

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

ps aux | grep -c myProcessName 

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

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

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

kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }') 
Нивед Танима
источник
Вы можете использовать следующую команду для отображения процесса ps aux | grep -c myProcessName, если вам нужно проверить счетчик этого процесса, запустите ps aux | grep -c myProcessName | grep -v grep, после которого вы можете завершить процесс, используя kill -9 $ (ps aux | grep -e myProcessName | awk '{print $ 2}')
Nived Thanima
13

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

killall -r my_pattern
Alex
источник
8

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

kraymer
источник
7

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

kill -9 $(ps aux | grep 'process' | grep -v 'grep' | awk '{print $2}')
Алекс Лю
источник
4

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

killall -r --regexp chrome

Аяз
источник
1
Вам нужно только или, -r или --regexp , которые являются коротким и GNU длинным вариантом, соответственно.
BigSmoke
3

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

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

или

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

Меня устраивает.

Луис Лопес
источник
1
Добро пожаловать в StackOverflow. Пожалуйста, используйте отступы 4 пробела или табуляции для строк кода, чтобы они были отформатированы как блоки кода. С наилучшими пожеланиями
YakovL
2

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

 pkill `pidof myprocess`

пример:

# kill all java processes
pkill `pidof java`
user6482587
источник
2

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

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

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

Мэджи Дэниел
источник
1

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

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

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

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

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

man pkill

Прем
источник
0

Я взял ответ Евгения Рика и работал с ним. Мой код добавляет следующее:

  1. ps ax включает в себя grep, поэтому я исключил его grep -Eiv 'grep'
  2. Добавлено несколько слов и эхо, чтобы сделать его читаемым человеком.

Я создал файл, назвал его killserver, вот оно:

#!/bin/bash
PROCESS_TO_KILL=bin/node
PROCESS_LIST=`ps ax | grep -Ei ${PROCESS_TO_KILL} | grep -Eiv 'grep' | awk ' { print $1;}'`
KILLED=
for KILLPID in $PROCESS_LIST; do
  if [ ! -z $KILLPID ];then
    kill -9 $KILLPID
    echo "Killed PID ${KILLPID}"
    KILLED=yes
  fi
done

if [ -z $KILLED ];then
    echo "Didn't kill anything"
fi

Результаты

  myapp git:(master) bash killserver
Killed PID 3358
Killed PID 3382
Killed
  myapp git:(master) bash killserver
Didn't kill anything
Меир Габай
источник
0

Это способ:

kill -9 $(pgrep -d' ' -f chrome)
MadMad666
источник
3
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
Игорь Ф.