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

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

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.


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)

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

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.


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!


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.


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}')     

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


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

-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>

Dostajękill: invalid argument f
rosstex

1
Spróbuj zamienić -f na -
Tony O'Hagan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.