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?
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?
Respuestas:
¿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.
echo kill -9 $pid
todos 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.
csh
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
killall -9 vi
killall
hace exactamente lo que el nombre sugiere ... mata el proceso de inicio.
pkill
es 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 vi
mata 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 vi
con un último argumento que termina en .conf
, use pkill -fx 'vi.*\.conf'
.
Para ver la lista de PID a los que pkill
enviarí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 ps
no 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 -k
para enviarles una señal. Por ejemplo, fuser -k /usr/bin/find
mata 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 -1234
o kill -HUP -1234
o cualquier otra señal.
Si no puede encontrar una mejor manera, úsela ps
con las opciones adecuadas para enumerar todos los procesos y filtrarlos con grep
algú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 grep
o en awk
sí mismo puede aparecer en la ps
salida ( ps
y 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 ps
salida.
pkill
Es muy lindo aquí. Puede darle muchos parámetros para refinar el patrón.
pkill
está disponible en Linux, BSD y Solaris - afaik. Por lo tanto, tiene una extensión mayor que killall
.
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]
pgrep -f "command name"
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 kill
sin 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.
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
ps -ef
en pkill
o pgrep
? Estos comandos no leen de la entrada estándar.
$ ps -eaf | grep "xyz" | grep -v grep | awk 'print $2' | xargs kill
ps -ef | pgrep -f "search" | xargs kill -9
pkill
desde elprocps
paquete.