Cómo matar múltiples procesos

21

para encontrar el PID del proceso para matar el uso:

pgrep <process command>

Luego uso el comando kill para matar el PID devuelto por pgrep <process command>

kill <PID>

¿Se pueden combinar estos comandos en uno para poder matar el PID o los PID devueltos pgrep <process command>? ¿O hay un método para matar múltiples procesos por nombre de comando?

Algo como : kill(pgrep <name of process>)

cielo azul
fuente
3
¿Lo intentaste pkill? Alternativamente, es posible que desee utilizar xargs.
MatthewRock
1
Tenga en cuenta que las páginas man también son buenas para cosas como esta. A menudo no solo le dicen cómo usar el comando, sino que también le informan sobre los comandos relacionados. En este caso, la pgreppágina de manual menciona pkilltodo el lugar (ya que los 2 comandos provienen del mismo paquete).
Patrick

Respuestas:

27

Puedes usar pkill:

pkill httpd

También es posible que desee utilizar la sustitución del proceso (aunque esto no es tan claro):

kill $(pgrep command)

Y es posible que desee utilizar xargs:

pgrep command | xargs kill
MatthewRock
fuente
44
Hice algo similar en una respuesta y se me señaló que introduje una condición de carrera. Los ID de proceso pueden invalidarse entre las llamadas a pgrepy kill. Solo úsalo pkill.
Kusalananda
3
@Kusalananda lo mismo también puede suceder entre pkillobtener la lista de procesos y enviar la señal, es más difícil de ver en ese caso.
hobbs
1
Iba a tratar de componer una respuesta que hiciera un bucle como kill $(ps|head -1)para evitar la condición de carrera ... pero realmente no hay forma de evitarla. El proceso podría morir en cualquier punto de la tubería.
Ross Presser
Solo tenga cuidado con pkill porque algunos programas pueden tener más de una instancia ejecutándose y es posible que no quiera matarlos a todos. Ejecutar pgrep primero ayudará siempre que no comience otro entre el momento en que ejecuta pgrep y pkill (carrera).
Joe
1
Incluso un programa en C no puede evitar la condición de carrera, la ventana será más pequeña. La única forma de hacerlo verdaderamente atómicamente sería agregar una llamada al sistema que elimine los procesos por su nombre. Pero las ID de proceso generalmente no se reutilizarán muy rápidamente, por lo que el peligro es prácticamente inexistente.
Barmar
17

También puedes usar killall, por ejemplo

killall firefox

para enviar SIGTERMa todos los firefoxprocesos.

Byte Commander
fuente
8
Tenga en cuenta que killalltiene diferentes significados en diferentes sistemas Unix: si está en un sistema que no es Linux, asegúrese de verificar la documentación.
Random832
killall -KILL firefoxpuede sentirse tan gratificante.
tubería
La no portabilidad de killalles por eso que nunca lo uso. Correr killallen una caja solaris, por ejemplo, es desastroso.
Patrick
9

Sí, puede usar una función bash y recorrer la salida.

$ for proc in $(pgrep <process command>); do kill $proc; done
lcipriani
fuente
Me salekill <no>:failed: operation not permitted
Timo
Probablemente usted no tiene los permisos correctos o el proceso no existe ya, por favor refiérase a: superuser.com/questions/1175485/...
lcipriani
0

Puede matar procesos múltiples con una matriz. En este caso, puede especificar opciones como $ip, $hostnameo algo similar.

ip=your_ip_address; declare -a arr=$(ps aux|grep tail|grep $ip|awk '{print $2}'); for pid in ${arr[@]}; do kill -9 $pid; done;
Vladyslav Greyswandir
fuente