Mata muchas instancias de un proceso en ejecución con un comando

75

Supongamos que tengo mil o más instancias de cualquier proceso (por ejemplo vi) en ejecución. ¿Cómo los mato a todos en un solo disparo / un comando de línea / un comando?

El caballero oscuro
fuente
3
No está claro para qué sistemas piensa que esto funcione. Por ejemplo, en Linux uso pkilldesde el procpspaquete.
Deer Hunter
La pregunta se hizo desde un punto de vista general. Conocía solo dos procesos como killall y a través de awk / sed. Pero quería saber si hay otras formas de lograr esto. Si se realiza de manera diferente en diferentes sistemas, entonces quiero saber en qué. Es muy engorroso para Google, en cambio pensé en hablar con todos ustedes, muchachos experimentados.
The Dark Knight

Respuestas:

97

¿Qué le pasa a los buenos viejos?

for pid in $(ps -ef | grep "some search" | awk '{print $2}'); do kill -9 $pid; done

Hay maneras de hacerlo más eficiente,

for pid in $(ps -ef | awk '/some search/ {print $2}'); do kill -9 $pid; done

y otras variaciones, pero en el nivel básico, siempre me ha funcionado.

OchoBitTony
fuente
1
Hasta votado, solo conocía la primera variación. El segundo parece más eficiente, gracias.
The Dark Knight
55
@TheDarkKnight El problema con este método es que a menudo terminas matando más de lo que esperabas. Escribir un confiable "alguna búsqueda" es complicado. En Linux, use pkill , que maneja la mayoría de las sutilezas.
Gilles 'SO- deja de ser malvado'
No estoy seguro de que sea tan complicado, si buscas un binario específico, puede ser bastante confiable. De echo kill -9 $pidtodos modos, siempre lo ejecuto por primera vez, así que sé lo que estoy obteniendo. No estoy seguro de que AIX tenga pkill, que es mi pan y mantequilla UNIX. Y es realmente lo suficientemente malo como para ser rechazado, extraño.
EightBitTony
1
A menos que sea absolutamente necesario, debe enviar el proceso SIGTERM en lugar de SIGKILL.
Debo agregar que estos 2 métodos no funcionarán en todos los shells, por ejemplo, no funcionarácsh
no sequitor
38

Usa killall,

killall vi

Esto matará a todos los comandos llamados 'vi'

También puede agregar una señal, por ejemplo, SIGKILL

killall -9 vi

margarita
fuente
Así es, también puede agregar la señal que desee, comokillall -9 vi
Hola Soy Edu Feliz Navidad
1
No creo que killall sea el más reciente: matar por archivo solo funciona para ejecutables que se mantienen abiertos durante la ejecución, es decir, los ejecutables impuros no se pueden eliminar de esta manera. Escribir killall name puede no tener el efecto deseado en sistemas que no son Linux, especialmente cuando lo hace un usuario privilegiado. ¿Qué sucede si estoy tratando de eliminar muchas instancias de algún proceso que no sea Linux? killall -w no detecta si un proceso desaparece y es reemplazado por un nuevo proceso con el mismo PID entre escaneos. Si los procesos cambian de nombre, es posible que killall no pueda hacerlos coincidir correctamente.
The Dark Knight
13
Tenga en cuenta que esto solo funciona en Linux y BSD. En Solaris y en otros sistemas, killallhace exactamente lo que el nombre sugiere ... mata el proceso de inicio.
Bobby
2
En AIX, "cancela todos los procesos que inició, excepto los que producen el proceso de Killall".
EightBitTony
31

pkilles lo que recomiendo, si está disponible ( Linux , FreeBSD , NetBSD , OpenBSD , Solaris ). Puede especificar procesos por el nombre del comando, por la línea de comando completa u otros criterios. Por ejemplo, pkill vimata todos los programas cuyo nombre de comando contiene la subcadena vi. Para matar solo los procesos llamados vi, use pkill -x vi. Para matar solo los procesos llamados vicon un último argumento que termina en .conf, use pkill -fx 'vi.*\.conf'.

Para ver la lista de PID a los que pkillenviaría una señal, use pgrep, que tiene exactamente la misma sintaxis, excepto que no acepta un nombre o número de señal. Para ver más información sobre estos procesos, ejecute

ps -p "$(pgrep …)"

En Linux, necesita en su ps -p $(pgrep -d, …)lugar (eso es un error: Linux psno es compatible con POSIX).

Otra forma común de identificar procesos para matar es los procesos que tienen un cierto archivo abierto (que puede ser el ejecutable del proceso). Puede enumerarlos con fuser; use fuser -kpara enviarles una señal. Por ejemplo, fuser -k /usr/bin/findmata todas las instancias en ejecución de find.

Si hay un proceso fuera de control que se mantiene bifurcado, es posible que deba matar a todo el grupo de procesos a la vez. Un grupo de procesos se identifica por lo negativo de su líder, que es el proceso ancestro de todos los procesos en el grupo. Para ver el grupo de procesos al que pertenece un proceso, ejecute ps -o pgid(más cualquier opción para seleccionar qué proceso (s) mostrar). Si determina que desea matar al líder de grupo del proceso 1234 y todos sus hijos, correr kill -1234o kill -HUP -1234o cualquier otra señal.

Si no puede encontrar una mejor manera, úsela pscon las opciones adecuadas para enumerar todos los procesos y filtrarlos con grepalgún otro comando de filtrado de texto. Tenga cuidado de no hacer coincidir accidentalmente otros procesos que ejecutan un comando con un nombre similar o un argumento que contiene ese nombre. Por ejemplo:

kill $(ps -o pid -o comm | awk '$2 == "vi" {print $1}')

Recuerde que su comando grepo en awksí mismo puede aparecer en la pssalida ( psy el comando de filtrado se inicia en paralelo, por lo que si se mostrará o no depende de la sincronización). Esto es particularmente importante si los argumentos del comando se incluyen en la pssalida.

Gilles 'SO- deja de ser malvado'
fuente
Muchas gracias, esto es realmente asombroso. Lo que has dado es una especie de tutorial. Gracias de nuevo . Votado
The Dark Knight
6

pkillEs muy lindo aquí. Puede darle muchos parámetros para refinar el patrón.

Nils
fuente
No está disponible en todos los UNIX, y no se menciona un sistema operativo UNIX específico o similar a UNIX en la pregunta.
EightBitTony
@EightBitTony pkillestá disponible en Linux, BSD y Solaris - afaik. Por lo tanto, tiene una extensión mayor que killall.
Nils
Estoy de acuerdo, pero killall es aún más problemático porque hay múltiples herramientas con el mismo nombre, que parecen tener un comportamiento dramáticamente diferente. Tampoco me gustan las respuestas de Killall. pkill no existe en AIX o HP-UX y, a pesar de lo que a algunas personas les gusta creer, todavía existe una base significativa de UNIX no Linux en el mundo.
EightBitTony
1
@EightBitTony es por eso que su respuesta es la aceptada. Pero no lo usaría en Solaris (que también es Unix).
Nils
6

La forma más fácil de hacerlo es primero verificar que esté obteniendo los ID de proceso correctos con:

pgrep -f [part_of_a_command]

Si el resultado es el esperado. Ir con:

pkill -f [part_of_a_command]
Tahsin Turkoz
fuente
o use:pgrep -f "command name"
Magne
3

Interesante nadie mencionó este. pidof genera pids de procesos separados por espacios que coinciden con el nombre del proceso pasado. Como tal, puede usar directamente su salida killsin tuberías. En Arch Linux yo uso

kill -9 $(pidof <proc name>)

La desventaja de esta solución es que no permite el uso de expresiones regulares.

sherrellbc
fuente
0

Te sugiero que lo intentes pkill.

Ex: ps -ef | pkill -f command

Para mostrar la lista de todos los procesos que deben eliminarse, primero intente pgrep:

Ex: ps -ef | pgrep -f command

Ankit Vashistha
fuente
1
¿Cuál es el propósito de canalizar la salida de ps -efen pkillo pgrep? Estos comandos no leen de la entrada estándar.
Kusalananda
0

Puede matar varios procesos diferentes utilizando el siguiente comando

pkill -9 -f "\.\/.+\s\.|process1|process2|process3\[^"

Tenga en cuenta que esto matará el proceso que coincide con el patrón anterior, los medios process1abc process2def process3ghitambién se matarán .

SandPox
fuente
-1

pgrep "name-of-application" | xargs kill -9

Fue lo suficientemente simple como para recordar y funcionó muy bien para mí.

Horv
fuente
-2
$ ps -eaf  | grep "xyz" | grep -v grep | awk 'print $2' | xargs kill
usuario110509
fuente
-2
ps -ef | pgrep -f "search" | xargs kill -9  
Avijit Dhar
fuente