Jak zabić wszystkie procesy pasujące do nazwy?

260

Powiedz, że chcę zabić każdy proces zawierający słowo amarok. Mogę wydrukować polecenia, które chcę wykonać. Ale jak mam sprawić, by powłoka je wykonała. to znaczy.

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
źródło
Dodać | sh -xpo pozostałej części wiersza poleceń?
Jonathan Leffler,
7
nigdy nie używaj kill -9w procesie patrz [zarządzanie procesem] [1] [1]: mywiki.wooledge.org/ ... ...
Fredrik Pihl
Dodanie do powyższego komentarza, że ​​nie tylko zabijanie -9 jest złym pomysłem, ale także fakt, że próbujesz zabić wiele procesów za pomocą ich nazwy. Nie ma nic wyjątkowego w nazwie procesu i dlatego jest złym kandydatem do identyfikacji.
Raul
Czy to też zabije amarokxproces? I pkill vi, zabija, supervisorctlktóry zawiera słowo „vi”.
Gank,
4
Ten artykuł na temat nieużywania -9jest dość nieprzydatny - czy są lepsze informacje na temat tego, dlaczego ludzie nie powinni go używać? Mówi tylko: „nie strzelaj do ludzi, którzy go używają”; ale wszystko, co kiedykolwiek widziałem wszędzie, to kill -9 {pid}to, jak coś zabić ...
dwanderson

Odpowiedzi:

437

Z man 1 pkill

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

Co oznacza na przykład, jeśli widzimy te linie w 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

Możemy zabić ich wszystkich za pomocą -fopcji pkill :

pkill -f httpd
Tim Bielawa
źródło
1
Wiem, że to nie dotyczy tematu tego pytania, ale pokazuje alternatywną i krótszą metodę robienia tego, co próbujesz zrobić.
Tim Bielawa,
19
Aby uzyskać dodatkową siłę, dodaj -9do końca!
mlissner,
Czy to też zabije httpdxproces? I pkill vi, zabija, supervisorctlktóry zawiera słowo „vi”.
Gank,
Niesamowite - Ubuntu 18.04.1 LTS
Genèse
W przypadku dopasowań bez rozróżniania wielkości liter -i, takich jak pkill -fi wine. Aby zweryfikować przed i po, użyj ps uax | grep -i wine.
vulcan raven
207
ps aux | grep -ie amarok | awk '{print $2}' | xargs kill -9 

xargs (1): xargs - konstruuj listy argumentów i uruchamiaj narzędzie. Przydatne, gdy chcesz potokować argumenty do czegoś takiego killlub podobnego ls.

Nektarios
źródło
3
Punkty za wzmiankę o xargs - wszystkie te rzeczy z pgrep / pkill są bardzo dobre, ale xargs jest narzędziem ogólnego przeznaczenia i standardem w każdym linuksie / unixie.
chrisdowney
4
„zabij: nie ma takiego procesu”
Cerin
3
Cerin, ponieważ próbuje także zabić proces grep, który już się zakończył. Powinno być dobrze.
Costi Muraru
6
Jest mała sztuczka w unikaniu przechwytywania procesu grep: ps aux | grep -ie [a] marok | awk '{print 2 USD}' | xargs kill -9
RCross
8
możesz także dodać kolejne wywołanie grep, aby odfiltrować grep (łatwiej mi to odczytać / zapamiętać) ps aux | grep -ie amarok | grep -v grep | awk '{print $2}' | xargs kill -9 ( grep -voznacza grep --invert)
driftcatcher 3'14
47

posługiwać się pgrep

kill -9 $(pgrep amarok)
Eric Fortis
źródło
26
nawet eleganter:pkill -9 amarok
glenn jackman
1
pkill obsługuje natywnie „każdy proces zawierający słowo <word>” bez tworzenia większej liczby potoków lub procesów. Zobacz opcję -f, aby wyszukać pełne nazwy procesów, aby wyeliminować potrzebę pgrep.
Tim Bielawa,
2
Uwaga, pkill domyślnie pozwala na częściowe dopasowanie nazw procesów. Polecenie to zabiłoby także amaroka 2, gdyby istniał. Użyj -x lub -f, jeśli chcesz podać dokładne nazwy.
user79878
Nie powiedzie się, jeśli nie pasują do pgrep
alfredocambera
do pełnego dopasowania nazwykill -9 $(pgrep -f amarok)
kinowy
27

Bezpiecznym sposobem na to jest:

pkill -f amarok
John Alexander Betts
źródło
1
Aby dodać do tego, dodałem -lflagę. Właśnie alias pkilldo, pkill -flwięc mogę uruchomić coś takiego, pkill jbossa to wypluje proces, który właśnie zabił.
nland
Czy to też zabije amarokxproces? I pkill vi, zabija, supervisorctlktóry zawiera słowo „vi”.
Gank
Czym różni się to od górnej odpowiedzi (Tima)? Po prostu pasuje do nazwy przykładu, inaczej wygląda identycznie? @ndlandpkill: invalid option -- 'l' - pkill z procps-ng 3.3.12
Xen2050
18

Myślę, że to polecenie killall jest dokładnie tym, czego potrzebujesz. Polecenie to opisuje się jako „zabijaj procesy według nazwy”. Jest łatwe w użyciu. Na przykład

killall chrome

To polecenie zabije cały proces Chrome. Oto link dotyczący polecenia killall

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

Mam nadzieję, że to polecenie może ci pomóc.

androidyue
źródło
To pasuje tylko według nazwy, a nie pełnego wiersza poleceń. Zdecydowanie nie to samo poszukiwanie ps auxjest wyjście
Xen2050
12

pkill -x dokładnie pasuje do nazwy procesu.

pkill -x amarok

pkill -f jest podobny, ale umożliwia stosowanie wzorca wyrażeń regularnych.

Zauważ, że pkill bez innych parametrów (np. -X, -f) pozwoli na częściowe dopasowanie nazw procesów. Zatem „pkill amarok” zabiłby amaroka, amaroka Bananę, bananaamaroka itp.

Chciałbym, żeby -x było zachowaniem domyślnym!

użytkownik79878
źródło
Czy to też zabije amarokxproces? I pkill vi, zabija, supervisorctlktóry zawiera słowo „vi”.
Gank,
@ Gank, tak, jakakolwiek nazwa procesu z „amarokiem”.
user79878,
Jak zabić tylko amaroka zamiast amaroka?
Gank
1
@ Gank, flaga -x. pkill -x amarok
user79878
4

Jeśli chcesz wykonać dane wyjściowe polecenia, możesz je wstawić do środka $(...), jednak w przypadku konkretnego zadania spójrz na polecenia killalli pkill.

Chen Levy
źródło
3

Możesz również ocenić swoje wyniki jako podproces, otaczając wszystko tykami lub umieszczając je wewnątrz $ ():

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

 $(ps aux | grep -ie amarok | awk '{print "kill -9 " $2}')     
dandrews
źródło
3

spróbuj kill -s 9ps -ef |grep "Nov 11" |grep -v grep | awk '{print $2}' Aby zabić procesy z 11 listopada lub kill -s 9 ps -ef |grep amarok|grep -v grep | awk '{print $2}' Aby zabić procesy zawierające słowo amarok

Victor Marrerp
źródło
0

Może dodanie poleceń do pliku wykonywalnego, ustawienie uprawnień + x, a następnie wykonanie?

ps aux | grep -ie amarok | awk '{print "kill -9 " $2}' > pk;chmod +x pk;./pk;rm pk
vova7865
źródło
-1

Jeśli używasz cygwina lub jakiejś minimalnej powłoki, której brakuje killall , możesz po prostu użyć tego skryptu:

killall.sh - Kill według nazwy procesu.

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

Stosowanie:

$ killall <process name>
Tony O'Hagan
źródło
Dostajękill: invalid argument f
rosstex
1
Spróbuj zamienić -f na -
Tony O'Hagan