Как убить все процессы, соответствующие имени?

261

Скажем, я хочу убить каждый процесс, содержащий слово amarok. Я могу распечатать команды, которые хочу выполнить. Но как мне заставить оболочку выполнить их? то есть.

ps aux | grep -ie amarok | awk '{print "kill -9 " $2}'
Output:
kill -9 3052
kill -9 3071
kill -9 3076
kill -9 3077
kill -9 3079
kill -9 3080
kill -9 3082
kill -9 3083
kill -9 3084
kill -9 3085
kill -9 3086
kill -9 3087
kill -9 3088
kill -9 3089
kill -9 4031
PuercoPop
источник
Добавить | sh -xпосле оставшейся части вашей командной строки?
Джонатан Леффлер
7
никогда не используйте kill -9процесс, см. [управление процессами] [1] [1]: mywiki.wooledge.org/… ...
Фредрик Пихл
В добавление к приведенному выше комментарию не только плохая идея kill -9, но и тот факт, что вы пытаетесь уничтожить несколько процессов с помощью их имени. В названии процесса нет ничего уникального и, следовательно, плохой кандидат на идентификацию.
Рауль-
Это amarokxтоже убьет процесс? Я pkill vi, он убивает, supervisorctlкоторый содержит слово "vi" в слове.
Ганк
4
Эта статья о -9неиспользовании довольно бесполезна - есть ли лучшая информация о том, почему люди не должны ее использовать? Он просто говорит: «Не увольняйте людей, которые его используют»; но все, что я когда-либо видел повсюду, это то kill -9 {pid}, как что-то убить ...
dwanderson

Ответы:

439

Из man 1 pkill

-f     The pattern is normally only matched against the process name.
       When -f is set, the full command line is used.

Что означает, например, если мы видим эти строки в ps aux:

apache   24268  0.0  2.6 388152 27116 ?        S    Jun13   0:10 /usr/sbin/httpd
apache   24272  0.0  2.6 387944 27104 ?        S    Jun13   0:09 /usr/sbin/httpd
apache   24319  0.0  2.6 387884 27316 ?        S    Jun15   0:04 /usr/sbin/httpd

Мы можем убить их всех с помощью -fопции pkill :

pkill -f httpd
Тим Белава
источник
1
Я понимаю, что это не затрагивает предмет этого вопроса, но демонстрирует альтернативный и более короткий метод выполнения того, что вы пытаетесь сделать.
Тим Белава
19
Для дополнительной силы добавьте -9в конец!
mlissner
Это httpdxтоже убьет процесс? Я pkill vi, он убивает, supervisorctlкоторый содержит слово "vi" в слове.
Ганк
Awesome - Ubuntu 18.04.1 LTS
Salathiel Genèse
Для совпадений без учета регистра используйте -i, как pkill -fi wine. Чтобы проверить до и после, используйте ps uax | grep -i wine.
вулкан ворон
207
ps aux | grep -ie amarok | awk '{print $2}' | xargs kill -9 

xargs (1): xargs - создать список аргументов и выполнить утилиту. Полезно , если вы хотите , чтобы трубы в аргументах к чему - то , как killили lsили так далее.

Нектарий
источник
3
Замечания по упоминанию xargs - все эти вещи в pgrep / pkill очень хороши, но xargs - это универсальный инструмент, и стандарт для каждого linux / unix.
chrisdowney
4
«убить: нет такого процесса»
Церин
3
Конечно, это потому, что он также пытается завершить процесс grep, который уже завершен. Это должно быть хорошо.
Кости Мурару
6
Есть небольшая хитрость, чтобы избежать захвата процесса grep: ps aux | grep -ie [a] marok | awk '{print $ 2}' | xargs kill -9
RCross
8
Вы также можете добавить еще один вызов grep, чтобы отфильтровать grep (мне легче читать / запоминать) ps aux | grep -ie amarok | grep -v grep | awk '{print $2}' | xargs kill -9 ( grep -vрасшифровывается grep --invert)
driftcatcher
47

использование pgrep

kill -9 $(pgrep amarok)
Эрик Фортис
источник
26
даже eleganter:pkill -9 amarok
Гленн Джекман
1
pkill обрабатывает часть «каждый процесс, содержащий слово <word>» изначально, не создавая больше каналов или процессов. Смотрите опцию -f для полного поиска имени процесса, чтобы исключить необходимость в pgrep.
Тим Белава
2
Помните, что по умолчанию pkill разрешает частичное сопоставление имен процессов. Эта команда также убила бы amarok2, если бы она существовала. Используйте -x или -f, если вы хотите указать точные имена.
user79878
Это не удастся, если не совпадают с pgrep
alfredocambera
для использования полного имени матчаkill -9 $(pgrep -f amarok)
cinatic
27

Безопасный способ сделать это:

pkill -f amarok
Джон Александр Беттс
источник
1
Чтобы добавить к этому, я добавил -lфлаг. На самом деле я просто pkillустановил псевдоним, pkill -flчтобы я мог запустить что-то вроде этого, pkill jbossи он выплюнет процесс, который он только что убил.
нланд
Это amarokxтоже убьет процесс? Я pkill vi, он убивает, supervisorctlкоторый содержит слово "vi" в слове.
Ганк
Чем это отличается от верхнего (тимского) ответа? Просто соответствует имени примера, в противном случае выглядит идентично? @ndland pkill: invalid option -- 'l'- pkill из procps-ng 3.3.12
Xen2050
18

Я думаю, что эта команда killall именно то, что вам нужно. Команда описывается как «убить процессы по имени». Это просто в использовании. Например

killall chrome

Эта команда убьет весь процесс Chrome. Вот ссылка на команду killall

http://linux.about.com/library/cmd/blcmdl1_killall.htm

Надеюсь, эта команда поможет вам.

androidyue
источник
Это соответствует только имени, а не полной командной строке. Определенно не то же самое, что и поиск ps aux«s выход
Xen2050
12

pkill -x точно соответствует имени процесса.

pkill -x amarok

pkill -f похож, но допускает шаблон регулярного выражения.

Обратите внимание, что pkill без других параметров (например, -x, -f) разрешит частичное совпадение имен процессов. Так что "pkill amarok" убил бы амарок, амарок банан, бананамарок и т. Д.

Я бы хотел, чтобы -x был поведением по умолчанию!

user79878
источник
Это amarokxтоже убьет процесс? Я pkill vi, он убивает, supervisorctlкоторый содержит слово "vi" в слове.
Ганк
@Gank, да, любое имя процесса с "amarok" в нем где-то.
user79878
Как убить только амарок вместо амарокса?
Ганк
1
@ Ганк, -х флаг. pkill -x amarok
user79878
4

Если вы хотите , чтобы выполнить вывод команды, вы можете поместить его внутрь $(...), однако для принять вашу конкретную задачу взглянуть на killallи pkillкоманд.

Чен Леви
источник
3

Вы также можете оценить свой вывод как подпроцесс, окружив все обратными галочками или поместив его в $ ():

`ps aux | grep -ie amarok | awk '{print "kill -9 " $2}'`

 $(ps aux | grep -ie amarok | awk '{print "kill -9 " $2}')     
dandrews
источник
3

пытаться kill -s 9ps -ef |grep "Nov 11" |grep -v grep | awk '{print $2}' Для уничтожения процессов от 11 ноября или kill -s 9 ps -ef |grep amarok|grep -v grep | awk '{print $2}' для уничтожения процессов, содержащих слово amarok

Виктор Маррерп
источник
0

Может быть, добавив команды в исполняемый файл, установив + x разрешение и затем выполнив?

ps aux | grep -ie amarok | awk '{print "kill -9 " $2}' > pk;chmod +x pk;./pk;rm pk
vova7865
источник
-1

Если вы используете Cygwin или какую-то минимальную оболочку, которой не хватает killall вы можете просто использовать этот скрипт:

killall.sh - убить по имени процесса.

#/bin/bash
ps -W | grep "$1" | awk '{print $1}' | xargs kill --

Использование:

$ killall <process name>
Тони О'Хаган
источник
Я получаюkill: invalid argument f
Росстекс
1
Попробуйте заменить -f на -
Тони О'Хаган