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 $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.
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
killallhace exactamente lo que el nombre sugiere ... mata el proceso de inicio.
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.
pkillEs muy lindo aquí. Puede darle muchos parámetros para refinar el patrón.
pkillestá 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 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.
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 -efen pkillo 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
pkilldesde elprocpspaquete.