¿Cómo eliminar todos los procesos con un nombre parcial determinado? [cerrado]
Quiero matar todos los procesos que obtengo mediante:
ps aux | grep my_pattern
¿Cómo hacerlo?
Esto no funciona:
pkill my_pattern
Use pkill -f
, que coincide con el patrón de cualquier parte de la línea de comando
pkill -f my_pattern
En caso de que no funcione, intenta usar este también:
pkill -9 -f my_pattern
Elimine todos los procesos que coincidan con la cadena "myProcessName":
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
Fuente: http://www.commandlinefu.com/commands/view/1138/ps-ef-grep-process-grep-v-grep-awk-print-2-xargs-kill-9
Por qué "ps pipe kill" desde la terminal es malo:
La tubería de números enteros que extrajo ps -ef
es kill -9
mala, y debería sentirse mal, doblemente si es root o un usuario con privilegios elevados, porque no le da a su proceso la oportunidad de cerrar limpiamente las conexiones de socket, limpiar archivos temporales, informar a sus hijos que va a desaparecer o restablecer las características de su terminal.
En su lugar envía 15, y espera uno o dos segundos, y si eso no funciona, envía 2, y si eso no funciona, envía 1. Si eso no funciona, QUITA EL BINARIO porque el programa se comporta mal.
Como principio general no utilizamos Unix Railgun para recortar los setos. https://porkmail.org/era/unix/award.html#kill
Explicación del comando anterior:
ps -ef
produce una lista de ID de proceso en la computadora visible para este usuario. El grupo de tuberías lo filtra para las filas que contienen esa cadena. Lo grep -v grep
que dice no coincide con el proceso en sí que realiza el grepping. La tubería awk print dice dividir las filas en el espacio en blanco delimitador predeterminado y filtrar a la segunda columna, que es nuestra identificación de proceso. La tubería xargs activa un nuevo proceso para enviar todos esos pid kill -9
y finalizarlos todos.
¿Por qué ps pipe kill
es malo, peligroso, feo y pirateado?
Existe una pequeña posibilidad de que cierre accidentalmente el sistema operativo o provoque un comportamiento indefinido en un proceso no relacionado, lo que provocará la inestabilidad de todo el sistema porque
ps -ef
enumera miles de procesos y no puede estar seguro de que algún proceso de terceros comparta su nombre de proceso, o que en el tiempo entre la lectura y la ejecución de kill -9, el ID de proceso había cambiado a otra cosa y ahora ha finalizado algún proceso aleatorio necesario que no está relacionado con el suyo.Si el código que se finaliza a la fuerza realiza operaciones de base de datos o transacciones seguras con condiciones de carrera de baja probabilidad, en una fracción de un porcentaje del tiempo, la atomicidad de esa transacción se arruinará, lo que producirá un comportamiento indefinido. Kill -9 no toma prisioneros. Si su código es sensible a esto, intente reemplazar la
xargs kill
pieza con un indicador transmitido que solicite un apagado ordenado y, solo si se rechaza esa solicitud, recurra como último recurso akill -9
Pero, si comprende todos los riesgos y los controla con nombres únicos, y está de acuerdo con algunas transacciones canceladas o corrupción ocasional, entonces el 99,9% de las veces estará bien. Si hay un problema, reinicie la computadora y asegúrese de que no haya colisiones de procesos. Es por un código como este que hace que el script de soporte técnico: "¿Has intentado reiniciar tu computadora?" sea un meme de nivel 5. "Un robot rebelde ps
buscó números enteros y los envió a kill -9
, así que reinicie la computadora para solucionar el problema.
¿ Por qué no utilizar pkill
cuál es más fácil?
Lo anterior me da control manual porque ,, ps
y son estándar multiplataforma. Brinda control total sobre qué motor de expresiones regulares usar, qué parte del nombre del proceso debe coincidir, maneja la distinción entre mayúsculas y minúsculas y la gestión de excepciones.grep
awk
kill
xargs
pkill -f -e -c myProcessName
Hace lo mismo para mí, pero veo que man pkill
tiene diferentes comportamientos, indicadores y motores de expresiones regulares entre las variantes de Linux, Mac, Zune-Bash y mi enrutador de código abierto. Entonces sí, ponga su Unix-Railgun de 35000 vatios en manos capaces de pkill para recortar los setos. Mira qué pasa.
Grepping una vez
Puede sustituir grep -v grep |
con corchetes la primera letra del comando matar, lo que hace lo mismo y evita que grep se registre, por ejemplo:
ps -ef | grep '[m]yProcessName' | awk '{print $2}' | xargs -r kill -9
Por qué funciona: https://askubuntu.com/questions/153419/how-does-this-tricky-bracket-expression-in-grep-work
Si necesita más flexibilidad en la selección de los procesos, utilice
for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do
kill -9 $KILLPID;
done
Puedes usar grep -e, etc.
Puede utilizar el siguiente comando para enumerar el proceso.
ps aux | grep -c myProcessName
Si necesita verificar el recuento de ese proceso, ejecute
ps aux | grep -c myProcessName |grep -v grep
después de lo cual puedes matar el proceso usando
kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }')