¿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

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

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í.


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)

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

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.


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!


¿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.


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}')     

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


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

-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>

Me estoy poniendokill: invalid argument f
rosstex

1
Intenta reemplazar -f con -
Tony O'Hagan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.