Jak zabić wiele procesów

21

aby znaleźć PID procesu zabicia, użyj:

pgrep <process command>

Następnie używam polecenia kill, aby zabić zwracany przez PID pgrep <process command>

kill <PID>

Czy te polecenia można połączyć w jedno, aby zabić PID lub PID zwrócone przez pgrep <process command>? Czy istnieje metoda zabicia wielu procesów według nazwy polecenia?

Coś jak : kill(pgrep <name of process>)

niebieskie niebo
źródło
3
Próbowałeś pkill? Alternatywnie możesz użyć xargs.
MatthewRock,
1
Pamiętaj, że strony podręcznika są również przydatne do takich rzeczy. Często mówią nie tylko, jak korzystać z polecenia, ale także o pokrewnych poleceniach. W tym przypadku pgrepstrona podręcznika wspomina pkillwszędzie (ponieważ 2 polecenia pochodzą z tego samego pakietu).
Patrick

Odpowiedzi:

27

Możesz użyć pkill:

pkill httpd

Możesz także skorzystać z zastępowania procesów (chociaż nie jest to tak jasne):

kill $(pgrep command)

I możesz użyć xargs:

pgrep command | xargs kill
MatthewRock
źródło
4
Zrobiłem podobnie w odpowiedzi i wskazano mi, że wprowadziłem warunek wyścigu. Identyfikatory procesu mogą zostać unieważnione między połączeniami do pgrepi kill. Po prostu użyj pkill.
Kusalananda
3
@ Kuşalananda to samo może się zdarzyć między pkilluzyskaniem listy procesów a faktycznym wysłaniem sygnału, w takim przypadku trudniej jest to dostrzec.
hobbs
1
Chciałem ułożyć odpowiedź, która zapętli coś w rodzaju kill $(ps|head -1)uniknięcia wyścigu ... ale tak naprawdę nie ma sposobu, aby tego uniknąć. Proces może umrzeć w dowolnym momencie rurociągu.
Ross Presser,
Bądź ostrożny z pkill, ponieważ niektóre programy mogą mieć więcej niż jedną instancję i możesz nie chcieć zabić ich wszystkich. Pierwsze uruchomienie pgrep pomoże, dopóki inny nie uruchomi się między uruchomieniem pgrep a pkill (wyścig).
Joe
1
Nawet program C nie może uniknąć wyścigu, okno będzie po prostu mniejsze. Jedynym sposobem, aby to zrobić naprawdę atomowo, byłoby dodanie wywołania systemowego, które zabija procesy według nazwy. Ale identyfikatory procesów na ogół nie będą ponownie używane bardzo szybko, więc niebezpieczeństwo praktycznie nie istnieje.
Barmar,
17

Możesz również użyć killallnp

killall firefox

wysłać SIGTERMdo wszystkich firefoxprocesów.

Bajt Dowódca
źródło
8
Pamiętaj, że killallma różne znaczenie w różnych systemach uniksowych - jeśli korzystasz z systemu innego niż Linux, sprawdź dokumentację.
Random832
killall -KILL firefoxczuję się bardzo satysfakcjonująco.
rura
Brak możliwości przenoszenia killalljest powodem, dla którego nigdy go nie używam. Na przykład bieganie killallna polu solaris jest katastrofalne.
Patrick
9

Tak, możesz użyć funkcji bash i zapętlenia wyjścia.

$ for proc in $(pgrep <process command>); do kill $proc; done
lcipriani
źródło
Rozumiemkill <no>:failed: operation not permitted
Timo,
Prawdopodobnie nie masz odpowiednich uprawnień lub proces już nie istnieje, zapoznaj się z: superuser.com/questions/1175485/…
lcipriani
0

Możesz zabić wiele procesów za pomocą tablicy. W tym przypadku można określić opcje jak $ip, $hostnamelub coś podobnego.

ip=your_ip_address; declare -a arr=$(ps aux|grep tail|grep $ip|awk '{print $2}'); for pid in ${arr[@]}; do kill -9 $pid; done;
Władysław Greyswandir
źródło