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?
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.
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
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:
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.
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:
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.
pkill
desde elprocps
paquete.Respuestas:
¿Qué le pasa a los buenos viejos?
Hay maneras de hacerlo más eficiente,
y otras variaciones, pero en el nivel básico, siempre me ha funcionado.
fuente
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 tengapkill
, 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
fuente
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 subcadenavi
. Para matar solo los procesos llamadosvi
, usepkill -x vi
. Para matar solo los procesos llamadosvi
con un último argumento que termina en.conf
, usepkill -fx 'vi.*\.conf'
.Para ver la lista de PID a los que
pkill
enviaría una señal, usepgrep
, 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, ejecuteEn Linux, necesita en su
ps -p $(pgrep -d, …)
lugar (eso es un error: Linuxps
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
; usefuser -k
para enviarles una señal. Por ejemplo,fuser -k /usr/bin/find
mata todas las instancias en ejecución defind
.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, correrkill -1234
okill -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 congrep
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:Recuerde que su comando
grep
o enawk
sí mismo puede aparecer en laps
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 laps
salida.fuente
pkill
Es muy lindo aquí. Puede darle muchos parámetros para refinar el patrón.fuente
pkill
está disponible en Linux, BSD y Solaris - afaik. Por lo tanto, tiene una extensión mayor quekillall
.La forma más fácil de hacerlo es primero verificar que esté obteniendo los ID de proceso correctos con:
Si el resultado es el esperado. Ir con:
fuente
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 usokill -9 $(pidof <proc name>)
La desventaja de esta solución es que no permite el uso de expresiones regulares.
fuente
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
fuente
ps -ef
enpkill
opgrep
? Estos comandos no leen de la entrada estándar.Puede matar varios procesos diferentes utilizando el siguiente comando
Tenga en cuenta que esto matará el proceso que coincide con el patrón anterior, los medios
process1abc
process2def
process3ghi
también se matarán .fuente
pgrep "name-of-application" | xargs kill -9
Fue lo suficientemente simple como para recordar y funcionó muy bien para mí.
fuente
fuente
fuente