Як вбити всі процеси, що відповідають імені?


260

Скажіть, я хочу вбити кожен процес, що містить слово 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

Додати | sh -xпісля залишку вашого командного рядка?
Джонатан Леффлер

7
ніколи не використовуйте kill -9процес, див. [управління процесами] [1] [1]: mywiki.wooledge.org/… ...
Фредрік Піль,

Додавши до вищезазначеного коментаря, що вбивство -9 є не лише поганою ідеєю, але й тим, що ви намагаєтесь вбити кілька процесів через їх ім’я. У назві процесу немає нічого унікального, а значить, поганий кандидат для ідентифікації.
Рауль-

Чи вб'є це amarokxтеж процес? Я pkill vi, він вбиває, supervisorctlщо містить `vi 'у слові.
Ганк

4
Ця стаття про -9невживання не дуже корисна - чи є краща інформація про те, чому люди не повинні її використовувати? У ньому просто сказано: "Не звольняйте людей, які цим користуються"; але все, що я коли-небудь бачив, це те kill -9 {pid}, як щось вбити ...
dwanderson

Відповіді:


437

З 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

Ми можемо вбити їх усіх за допомогою параметра pkill -f:

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
навіть елегантність:pkill -9 amarok
glenn jackman

1
pkill керує частиною "кожен процес, що містить слово <word>", не створюючи більше труб або процесів. Дивіться опцію -f для повного пошуку імені процесу, щоб усунути необхідність pgrep.
Тім Білава

2
Слідкуйте за тим, що pkill за замовчуванням дозволяє часткове узгодження імен процесів. Ця команда також вбила б amarok2, якби вона існувала. Використовуйте -x або -f, якщо ви хочете вказати точні імена.
користувач79878

Він не вийде, якщо не відповідатимуть pgrep
alfredocambera

для повного використання імені матчуkill -9 $(pgrep -f amarok)
кінотеатр

27

Безпечний спосіб зробити це:

pkill -f amarok

1
Щоб додати це, я додав -lпрапор. Я насправді просто відчужений, pkillщоб pkill -flя міг запустити щось на кшталт, pkill jbossі це виплюне процес, який він просто вбив.
nland

Чи вб'є це 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

Сподіваюся, ця команда може вам допомогти.


Це збігається лише за назвою, а не повним командним рядком. Однозначно не те саме, що пошук ps auxрезультатів пошуку
Xen2050

12

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

pkill -x amarok

pkill -f схожий, але дозволяє використовувати закономірний вираз.

Зауважте, що pkill без інших параметрів (наприклад, -x, -f) дозволить часткові збіги назви процесів. Так "pkill amarok" вбивав би амарок, amarokBanana, bananaamarok тощо.

Я б хотів, щоб -x була поведінка за замовчуванням!


Чи вб'є це amarokxтеж процес? Я pkill vi, він вбиває, supervisorctlщо містить `vi 'у слові.
Ганк

@Gank, так, будь-яке ім'я процесу з "amarok" в ньому десь.
користувач79878

Як тільки вбити amarok замість amarokx?
Ганк

1
@ Ганк, -x прапор. pkill -x amarok
користувач79878

4

Якщо ви хочете виконати вихід команди, ви можете помістити її всередину $(...), однак для конкретного завдання подивіться на команди killallта pkillкоманди.


3

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

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

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

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

-1

Якщо ви використовуєте cygwin або якусь мінімальну оболонку, якої не вистачає, killallви можете просто скористатися цим сценарієм:

killall.sh - вбити за назвою процесу.

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

Використання:

$ killall <process name>

Я отримуюkill: invalid argument f
rosstex

1
Спробуйте замінити -f на -
Тоні О'Хаган
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.