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


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

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.


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


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