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.