¿Cómo eliminar todos los procesos con un nombre parcial determinado? [cerrado]

Resuelto Łukasz Lew asked hace 12 años • 14 respuestas

Quiero matar todos los procesos que obtengo mediante:

ps aux | grep my_pattern

¿Cómo hacerlo?

Esto no funciona:

pkill my_pattern
Łukasz Lew avatar Jan 24 '12 19:01 Łukasz Lew
Aceptado

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
dorsh avatar Jan 24 '2012 12:01 dorsh

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 -efes kill -9mala, 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 -efproduce 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 grepque 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 -9y finalizarlos todos.

¿Por qué ps pipe killes malo, peligroso, feo y pirateado?

  1. 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 -efenumera 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.

  2. 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 killpieza 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 psbuscó números enteros y los envió a kill -9, así que reinicie la computadora para solucionar el problema.

¿ Por qué no utilizar pkillcuál es más fácil?

Lo anterior me da control manual porque ,, psy 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.grepawkkillxargs

pkill -f -e -c myProcessName

Hace lo mismo para mí, pero veo que man pkilltiene 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

Eric Leschinski avatar May 28 '2015 18:05 Eric Leschinski

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.

Eugen Rieck avatar Jan 24 '2012 12:01 Eugen Rieck

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 }') 
Nived Karimpunkara avatar Jun 21 '2016 07:06 Nived Karimpunkara