Come uccidere tutti i processi che corrispondono a un nome?


260

Di 'che voglio uccidere ogni processo contenente la parola amarok. Posso stampare i comandi che voglio eseguire. Ma come posso effettivamente farli eseguire dalla shell. vale a dire.

ps aux | grep -ie amarok | awk '{print "kill -9 " $2}'
Output:
kill -9 3052
kill -9 3071
kill -9 3076
kill -9 3077
kill -9 3079
kill -9 3080
kill -9 3082
kill -9 3083
kill -9 3084
kill -9 3085
kill -9 3086
kill -9 3087
kill -9 3088
kill -9 3089
kill -9 4031

Aggiungi | sh -xdopo il resto della riga di comando?
Jonathan Leffler,

7
mai e poi mai usare kill -9su un processo vedi [process management] [1] [1]: mywiki.wooledge.org/… ...
Fredrik Pihl,

Aggiungendo al commento sopra che non solo l'uccisione -9 è una cattiva idea, ma anche il fatto che stai cercando di uccidere più processi tramite il loro nome. Non c'è nulla di unico nel nome di un processo e quindi è un cattivo candidato per l'identificazione.
Raul

Ucciderà anche il amarokxprocesso? Aggiungo vi, uccide supervisorctlche contiene "vi" nella parola.
Gank,

4
Quell'articolo sul non utilizzo -9è piuttosto inutile - ci sono informazioni migliori sul perché le persone non dovrebbero usarlo? Dice semplicemente "non licenziare le persone che lo usano"; ma tutto ciò che ho mai visto dappertutto è che kill -9 {pid}è come uccidere qualcosa ...
Dwanderson,

Risposte:


438

A partire dal man 1 pkill

-f     The pattern is normally only matched against the process name.
       When -f is set, the full command line is used.

Il che significa, ad esempio, se vediamo queste righe in ps aux:

apache   24268  0.0  2.6 388152 27116 ?        S    Jun13   0:10 /usr/sbin/httpd
apache   24272  0.0  2.6 387944 27104 ?        S    Jun13   0:09 /usr/sbin/httpd
apache   24319  0.0  2.6 387884 27316 ?        S    Jun15   0:04 /usr/sbin/httpd

Possiamo ucciderli tutti usando l' -fopzione pkill :

pkill -f httpd

1
Mi rendo conto che questo non affronta l'argomento di questa domanda, ma dimostra un metodo alternativo e più breve di fare ciò che stai cercando di fare.
Tim Bielawa,

19
Per una maggiore forza, aggiungi -9alla fine!
mlissner,

Ucciderà anche il httpdxprocesso? Aggiungo vi, uccide supervisorctlche contiene "vi" nella parola.
Gank,

Fantastico - Ubuntu 18.04.1 LTS
Salathiel Genèse,

Per le corrispondenze senza distinzione tra maiuscole e minuscole -i, utilizzare , ad esempio pkill -fi wine. Per verificare prima e dopo, utilizzare ps uax | grep -i wine.
corvo vulcanico

207
ps aux | grep -ie amarok | awk '{print $2}' | xargs kill -9 

xargs (1): xargs - costruisce gli elenchi di argomenti ed esegue l'utilità. Utile quando si desidera convogliare in argomenti per qualcosa di simile killo di lso così via.


3
Punti per menzionare xargs: tutto questo materiale pgrep / pkill va benissimo, ma xargs è uno strumento generico e standard su ogni Linux / Unix.
chrisdowney,

4
"uccidi: nessun processo simile"
Cerin,

3
Cerin è perché sta cercando di uccidere anche il processo grep, che è già finito. Dovrebbe andare bene.
Costi Muraru,

6
C'è un piccolo trucco per evitare di catturare il processo grep: ps aux | grep -ie [a] marok | awk '{print $ 2}' | xargs uccide -9
RCross il

8
puoi anche aggiungere un'altra chiamata grep per filtrare grep (lo trovo più facile da leggere / ricordare) ps aux | grep -ie amarok | grep -v grep | awk '{print $2}' | xargs kill -9 ( grep -vsta per grep --invert)
driftcatcher,

47

uso pgrep

kill -9 $(pgrep amarok)

26
anche eleganter:pkill -9 amarok
glenn jackman,

1
pkill gestisce la parte "ogni processo contenente la parola <word>" in modo nativo senza creare più pipe o processi. Vedere l'opzione -f per la ricerca completa del nome del processo per eliminare la necessità di pgrep.
Tim Bielawa,

2
Attenzione che pkill per impostazione predefinita consente una corrispondenza parziale sui nomi dei processi. Questo comando ucciderebbe anche amarok2 se esistesse. Utilizzare -xo -f se si desidera specificare nomi esatti.
user79878,

Fallirà se non ci sono corrispondenze per pgrep
alfredocambera,

per l'uso della corrispondenza per nome completokill -9 $(pgrep -f amarok)
cinatic

27

Il modo sicuro per farlo è:

pkill -f amarok

1
Per aggiungere a questo, ho aggiunto la -lbandiera. In realtà mi sono appena allentato pkillper pkill -flpoter eseguire qualcosa del genere pkill jbosse sputerà il processo che ha appena ucciso.
nland

Ucciderà anche il amarokxprocesso? Aggiungo vi, uccide supervisorctlche contiene "vi" nella parola.
Gank,

In che modo differisce dalla risposta superiore (di Tim)? Corrisponde semplicemente al nome dell'esempio, altrimenti sembra identico? @ndland pkill: invalid option -- 'l'- pkill da procps-ng 3.3.12
Xen2050

18

Penso che questo comando killall sia esattamente ciò di cui hai bisogno. Il comando è descritto come "uccidi processi per nome". È facile da usare, ad esempio

killall chrome

Questo comando ucciderà tutto il processo di Chrome. Ecco un link sul comando killall

http://linux.about.com/library/cmd/blcmdl1_killall.htm

Spero che questo comando ti possa aiutare.


Questo corrisponde solo al nome, non alla riga di comando completa. Sicuramente non è lo stesso ps auxdell'output della ricerca
Xen2050,

12

pkill -x corrisponde esattamente al nome del processo.

pkill -x amarok

pkill -f è simile ma consente un modello di espressione regolare.

Nota che pkill senza altri parametri (es. -X, -f) consentirà corrispondenze parziali sui nomi dei processi. Quindi "pkill amarok" ucciderebbe amarok, amarokBanana, bananaamarok, ecc.

Vorrei che -x fosse il comportamento predefinito!


Ucciderà anche il amarokxprocesso? Aggiungo vi, uccide supervisorctlche contiene "vi" nella parola.
Gank,

@Gank, sì, qualsiasi nome di processo con "amarok" in esso da qualche parte.
user79878

Come uccidere solo amarok invece di amarokx?
Gank,

1
@ Gank, -x flag. pkill -x amarok
user79878

4

Se si desidera eseguire l'output di un comando, è possibile inserirlo all'interno $(...), tuttavia per l'attività specifica dare un'occhiata ai comandi killalle pkill.


3

Puoi anche valutare il tuo output come un processo secondario, circondando tutto con tick posteriori o inserendolo in $ ():

`ps aux | grep -ie amarok | awk '{print "kill -9 " $2}'`

 $(ps aux | grep -ie amarok | awk '{print "kill -9 " $2}')     

3

provare a uccidere -s 9ps -ef |grep "Nov 11" |grep -v grep | awk '{print $2}' Per uccidere i processi dell'11 novembre o kill -s 9 ps -ef |grep amarok|grep -v grep | awk '{print $2}' Per uccidere i processi che contengono la parola amarok


0

Forse aggiungendo i comandi al file eseguibile, impostando l'autorizzazione + x e quindi eseguendo?

ps aux | grep -ie amarok | awk '{print "kill -9 " $2}' > pk;chmod +x pk;./pk;rm pk

-1

Se stai usando cygwin o qualche shell minima che manca killall, puoi semplicemente usare questo script:

killall.sh - Uccidi per nome del processo.

#/bin/bash
ps -W | grep "$1" | awk '{print $1}' | xargs kill --

Uso:

$ killall <process name>

Ricevokill: invalid argument f
rosstex

1
Prova a sostituire -f con -
Tony O'Hagan
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.