¿Cómo matar todos los procesos que coinciden con un nombre?

261

Digamos que quiero matar todos los procesos que contienen la palabra amarok. Puedo imprimir los comandos que quiero ejecutar. Pero, ¿cómo hago para que el shell los ejecute? es decir.

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
PuercoPop
fuente
Agregar | sh -xdespués del resto de su línea de comando?
Jonathan Leffler
77
nunca usar kill -9en un proceso ver [gestión de procesos] [1] [1]: mywiki.wooledge.org/… ...
Fredrik Pihl
Agregando al comentario anterior que no solo el kill -9 es una mala idea, sino también el hecho de que está tratando de matar múltiples procesos a través de su nombre. No hay nada único en el nombre de un proceso y, por lo tanto, es un mal candidato para la identificación.
Raul-
¿Va a matar el amarokxproceso también? Hago vi, mata lo supervisorctlque contiene 'vi' en la palabra.
Gank
44
Ese artículo sobre no usar -9es bastante inútil: ¿hay alguna información mejor sobre por qué las personas no deberían usarlo? Simplemente dice "no lo hagas, y despide a las personas que lo usan"; pero todo lo que he visto en cualquier otro lugar es que kill -9 {pid}es cómo matar algo ...
dwanderson

Respuestas:

439

De man 1 pkill

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

Lo que significa, por ejemplo, si vemos estas líneas en 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

Podemos matarlos a todos usando la -fopción pkill :

pkill -f httpd
Tim Bielawa
fuente
1
Me doy cuenta de que esto no aborda el tema de esta pregunta, pero sí demuestra un método alternativo y más corto de hacer lo que estás tratando de hacer.
Tim Bielawa
19
Para mayor resistencia, ¡agrégalo -9al final!
mlissner
¿Va a matar el httpdxproceso también? Hago vi, mata lo supervisorctlque contiene 'vi' en la palabra.
Gank
Impresionante - Ubuntu 18.04.1 LTS
Salathiel Genèse
Para coincidencias que no distinguen entre mayúsculas y minúsculas, use -ilike pkill -fi wine. Para verificar antes y después, use ps uax | grep -i wine.
cuervo vulcano
207
ps aux | grep -ie amarok | awk '{print $2}' | xargs kill -9 

xargs (1): xargs - construye listas de argumentos y ejecuta la utilidad. Útil cuando quieres canalizar argumentos sobre algo así killo algo lsasí.

Nektarios
fuente
3
Puntos para mencionar xargs: todo esto pgrep / pkill está muy bien, pero xargs es una herramienta de propósito general y estándar en todos los Linux / Unix.
chrisdowney
44
"kill: No such process"
Cerin
3
Cerin es porque también está tratando de matar el proceso grep, que ya terminó. Debería estar bien.
Costi Muraru
66
Hay un pequeño truco para evitar capturar el proceso grep: ps aux | grep -ie [a] marok | awk '{print $ 2}' | xargs kill -9
RCross
8
también puede agregar otra llamada grep para filtrar grep (me parece más fácil de leer / recordar) ps aux | grep -ie amarok | grep -v grep | awk '{print $2}' | xargs kill -9 ( grep -vsignifica grep --invert)
driftcatcher
47

utilizar pgrep

kill -9 $(pgrep amarok)
Eric Fortis
fuente
26
incluso elegante:pkill -9 amarok
Glenn Jackman
1
pkill maneja la parte "cada proceso que contiene la palabra <word>" de forma nativa sin crear más tuberías o procesos. Consulte la opción -f para buscar el nombre completo del proceso y eliminar la necesidad de pgrep.
Tim Bielawa
2
Tenga en cuenta que pkill por defecto permite una coincidencia parcial en los nombres de los procesos. Este comando también mataría a amarok2 si existiera. Use -x o -f si desea especificar nombres exactos.
user79878
Fallará si no hay coincidencias para pgrep
alfredocambera
para uso de partido de nombre completokill -9 $(pgrep -f amarok)
cinatic
27

La forma segura de hacer esto es:

pkill -f amarok
John Alexander Betts
fuente
1
Para agregar a esto, agregué la -lbandera. De hecho, simplemente me alias pkillpara pkill -flpoder ejecutar algo como pkill jbossy escupirá el proceso que acaba de matar.
nland
¿Va a matar el amarokxproceso también? Hago vi, mata lo supervisorctlque contiene 'vi' en la palabra.
Gank
¿Cómo es esto diferente de la respuesta superior (de Tim)? Simplemente coincide con el nombre del ejemplo, de lo contrario parece idéntico? @ndland pkill: invalid option -- 'l'- pkill de procps-ng 3.3.12
Xen2050
18

Creo que este comando killall es exactamente lo que necesitas. El comando se describe como "matar procesos por nombre". Es fácil de usar. Por ejemplo

killall chrome

Este comando matará todo el proceso de Chrome. Aquí hay un enlace sobre el comando killall

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

Espero que este comando te pueda ayudar.

androidyue
fuente
Esto solo coincide con el nombre, no con la línea de comando completa. Definitivamente no es lo mismo que buscar ps auxla salida
Xen2050
12

pkill -x coincide exactamente con el nombre del proceso.

pkill -x amarok

pkill -f es similar pero permite un patrón de expresión regular.

Tenga en cuenta que pkill sin otros parámetros (por ejemplo, -x, -f) permitirá coincidencias parciales en los nombres de los procesos. Entonces "pkill amarok" mataría a amarok, amarokBanana, bananaamarok, etc.

¡Ojalá -x fuera el comportamiento predeterminado!

usuario79878
fuente
¿Va a matar el amarokxproceso también? Hago vi, mata lo supervisorctlque contiene 'vi' en la palabra.
Gank
@Gank, sí, cualquier nombre de proceso con "amarok" en alguna parte.
user79878
¿Cómo matar solo amarok en lugar de amarokx?
Gank
1
@ Gank, -x bandera. pkill -x amarok
user79878
4

Si desea ejecutar la salida de un comando, puede ponerlo dentro $(...), sin embargo, para su tarea específica, eche un vistazo a los comandos killally pkill.

Chen Levy
fuente
3

También puede evaluar su salida como un subproceso, rodeando todo con ticks de retroceso o poniéndolo dentro de $ ():

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

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

pruebe kill -s 9ps -ef |grep "Nov 11" |grep -v grep | awk '{print $2}' para eliminar los procesos del 11 de noviembre o kill -s 9 ps -ef |grep amarok|grep -v grep | awk '{print $2}' para eliminar los procesos que contienen la palabra amarok

Victor Marrerp
fuente
0

¿Quizás agregar los comandos al archivo ejecutable, configurar + x permiso y luego ejecutar?

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

Si está usando cygwin o algún shell mínimo que carece killall , puede usar este script:

killall.sh: matar por nombre de proceso.

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

Uso:

$ killall <process name>
Tony O'Hagan
fuente
Me estoy poniendokill: invalid argument f
rosstex
1
Intenta reemplazar -f con -
Tony O'Hagan