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.