Jak zabić cały proces o podanym imieniu?


16

Uruchamiam polecenie ps -A | grep <application_name>i uzyskuję listę takich procesów:

19440 ?        00:00:11 <application_name>
21630 ?        00:00:00 <application_name>
22694 ?        00:00:00 <application_name>

Chcę zabić cały proces z listy: 19440, 21630, 22694.

Próbowałem, ps -A | grep <application_name> | xargs kill -9 $1ale działa z błędami.

kill: illegal pid ?
kill: illegal pid 00:00:00
kill: illegal pid <application_name>

Jak mogę to zrobić z wdziękiem?

Odpowiedzi:



9

Problem polega na tym, że ps -A | grep <application_name> | xargs -n1zwraca dane wyjściowe w ten sposób

19440
?
00:00:11
<application_name>
21630
?
00:00:00
<application_name>
22694
?
00:00:00
<application_name>

Możesz użyć awkdo uzyskania najpierw kolumny pswyników .

ps -A | grep <application_name> | awk '{print $1}' | xargs -n1

Zwróci listę PID

19440
21630
22694

I dodając kill -9 $1, masz polecenie, które zabija wszystkie PID

ps -A | grep <application_name> | awk '{print $1}' | xargs kill -9 $1

Test ten jest idealny I to na skrypcie bash to zabija processer natychmiast bez błędów + nawet jeśli is'nt Proces ten rozpoczął się nie wykazuje żadnych błędów, które jest to, co chcę, tu przykładem ffmpeg processer zabójcy nano /usr/bin/ffmpegk . . . . ps -A | grep ffmpeg | awk '{print $1}' | xargs kill -9 $1 . . . . chmod a+rx /usr/bin/ffmpegk
Salem F

Mam problem z tym, że otrzymuję wynik, kill -9jeśli żaden proces nie pasuje
Daniel F

1
Zamiast tego greppowinieneś użyć, awkaby dopasować do nazwy:ps -A | awk "\$4 == \"$1\" { print \$1; }"
Toby Speight

0

killall mogę to zrobić.

$ killall application_name

Czy kill all pozwala na wyrażenie regularne w nazwie aplikacji?
Łukasz D. Tulikowski

killall --regexp "appl.*me"Chociaż mogą istnieć różne implementacje killall. Zobaczyć man killall.
rudimeier

killall nie dość czasami muszę wysłać go trzy razy, aby zabić proces, a nawet go nie zabić, jedynym szybkim działającym rozwiązaniem dla mnie jest kill -9 pidmyślę, że @ ŁukaszD.Tulikowski jest najlepszym działającym rozwiązaniem specjalnie dla skryptów bash.
Salem F

-1
ps -eaf | grep -i applicationname| grep -iv 'grep'| awk '{print "kill -9" " "  $2}'|sh

Chociaż nie głosowałem jeszcze nad tym pytaniem, nie opisałeś, dlaczego jest ono inne lub lepsze niż inne rozwiązania - które są bardzo podobne do tego - ani nie opisałeś, dlaczego OP miał problem z ich odmianą.
Jeff Schaller

-2

Moje podejście jest podobne do @ Łukasz D. Tulikowski. Zamiast używać grep <application_name>; Użyłem grep "[a]pplication_name", który nie pasuje do własnej linii poleceń procesu.

Wyrażenie w nawiasach kwadratowych jest częścią grepdopasowania wzorca klasy znaków. (Odniesienie) .


Możesz użyć awkdo uzyskania najpierw kolumny pswyników.

ps -A | grep "[a]pplication_na" | awk '{print $2}' | xargs -n1

Zwróci listę PID

7644
407
406

Później dodając kill -9 $1masz polecenie, które zabija wszystkie PID

ps aux | grep "[a]pplication_na" | awk '{print $2}' | xargs kill -9 $1

Dlaczego grepzamiast używać awkdo poprawnego wykonania testu? grepdopasuje na przykład nazwy zawierające cel jako podłańcuch.
Toby Speight,
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.