Come uccidere tutti i processi con un determinato nome?


16

Eseguo il comando ps -A | grep <application_name>e ottengo un elenco di processi come questo:

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

Voglio uccidere tutti i processi dalla lista: 19440, 21630, 22694.

Ho provato ps -A | grep <application_name> | xargs kill -9 $1ma funziona con errori.

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

Come posso farlo con garbo?

Risposte:


25
pkill -f <application_na>

Ucciderà tutti i processi che contengono lo schema <application_na>nei loro nomi.

uomo pkill


9

Il problema è che ps -A | grep <application_name> | xargs -n1restituisce un output in questo modo

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

È possibile utilizzare awkper ottenere prima una colonna di psoutput .

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

Restituirà un elenco di PID

19440
21630
22694

E aggiungendo kill -9 $1hai un comando che uccide tutti i PID

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

questo è I test perfetto su script bash è uccide il processer immediatamente senza errori +, anche se il processo è iniziato is'nt non mostra errori che è quello che voglio, qui esempio di ffmpeg processer killer nano /usr/bin/ffmpegk . . . . ps -A | grep ffmpeg | awk '{print $1}' | xargs kill -9 $1 . . . . chmod a+rx /usr/bin/ffmpegk
— Salem F,

Ho un problema con questo in cui ottengo l'output kill -9se nessun processo corrisponde
— Daniel F

1
Invece di grep, dovresti usare awkper abbinare il nome:ps -A | awk "\$4 == \"$1\" { print \$1; }"
— Toby Speight

0

killall posso farlo.

$ killall application_name

Uccidere tutto consente l'espressione regolare in un nome di applicazione?
— Łukasz D. Tulikowski il

killall --regexp "appl.*me"Sebbene potrebbero esserci diverse implementazioni killall. Vedere man killall.
— rudimeier,

killall non abbastanza a volte ho bisogno di inviarlo tre volte per terminare il processo, e anche non riuscire a ucciderlo, l'unica soluzione veloce per me è kill -9 pidche penso che @ ŁukaszD.Tulikowski è la migliore soluzione di lavoro appositamente per gli script bash.
— Salem F,

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

Sebbene non abbia ancora votato su questa domanda, non hai descritto perché questo è diverso o migliore rispetto alle altre soluzioni - che sono molto simili a questo - o ha descritto perché l'OP ha avuto problemi con la loro variazione.
— Jeff Schaller

-2

Il mio approccio è simile a quello di @ Łukasz D. Tulikowski. Invece di usare grep <application_name>; Ho usato grep "[a]pplication_name", che non corrisponde alla propria riga di comando del processo.

L'espressione parentesi quadra fa parte della grepcorrispondenza del modello di classe di caratteri. (Riferimento) .


È possibile utilizzare awkper ottenere prima una colonna di psoutput.

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

Restituirà un elenco di PID

7644
407
406

Successivamente aggiungendo kill -9 $1hai un comando che uccide tutti i PID

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

Perché grepinvece di utilizzare awkper eseguire il test in modo più corretto? grepcorrisponderà ai nomi che includono la destinazione come sottostringa, ad esempio.
— Toby Speight,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.