¿Cómo matar todos los procesos con un nombre parcial dado? [cerrado]

623

Quiero matar todos los procesos que obtengo:

ps aux | grep my_pattern

¿Cómo hacerlo?

Esto no funciona:

pkill my_pattern
Łukasz Lew
fuente
11
¿Es my_patternsimplemente una subcadena del nombre o contiene caracteres especiales de expresiones regulares?
Sven Marnach

Respuestas:

1318

Uso pkill -f, que coincide con el patrón para cualquier parte de la línea de comando

pkill -f my_pattern
Dor Shemer
fuente
77
@Jayan: también es bastante indiscriminado en su asesinato. Es sorprendentemente fácil de manejar ...
thkala
1
@Jayan: no me vas a convencer :-). Me han quemado demasiadas veces las secuencias de comandos de terceros que insistieron en usar pkill, el error más común es la suposición de que solo una instancia de cada binario podría existir en un momento dado.
thkala
44
Para cualquier usuario de Mac que encuentre esta respuesta, como lo hice, el equivalente de Mac es killall -m my_pattern.
Zev Eisenberg
1
Si tiene varios procesos colgantes que no se matan, use pkill -f -9 para matarlos sin piedad
MacK
18
Recomiendo usar pgrepprimero para verificar lo que vas a matar. Puede usar pgrep -lpara ver nombres de procesos o pgrep -apara ver líneas de comando completas. Utiliza las mismas banderas que pkill. Entonces, en este caso, podrías usar pgrep -fa my_pattern.
studgeek
158

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

¿Qué está haciendo este código?

El ps -efproduce una lista de identificadores de proceso en la computadora visible para este usuario. El grep de tubería lo filtra hacia abajo para las filas que contienen esa cadena. El grep -v grepdicho no coincide en el proceso en sí haciendo el grepping. La impresión awk de tubería 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 hace girar un nuevo proceso para enviar todos esos pid kill -9, terminando con todos.

El código anterior es malo, peligroso, feo y hackeo por varias razones.

  1. Si el código que finaliza forzosamente está haciendo operaciones de base de datos o transacciones seguras con condiciones de carrera de baja probabilidad, una fracción del porcentaje del tiempo, la atomicidad de esa transacción se arruinará, produciendo un comportamiento indefinido. kill -9 no toma prisioneros. Si su código es sensible a esto, intente reemplazar la xargs killparte con un indicador transmitido que solicite un apagado correcto, y solo si esa solicitud es denegada, el último recurso parakill -9

  2. Existe una posibilidad distinta de cero de que accidentalmente finalice el sistema operativo o provoque un comportamiento indefinido en un proceso no relacionado, lo que lleva a la inestabilidad de todo el sistema porque ps -efenumera todos los procesos posibles que podrían existir, y no puede estar seguro de que alguna biblioteca de terceros extraña comparta su nombre del proceso, o que en el tiempo entre leer y ejecutar kill -9, el processid había cambiado a otra cosa, y ahora accidentalmente ha finalizado algún proceso aleatorio que no tenía la intención.

Pero, si comprende los riesgos y los controla con nombres muy únicos, y está de acuerdo con algunas transacciones caídas o corrupción ocasional en los datos, entonces el 99.9% del tiempo estará bien. Si hay un problema, reinicie la computadora, asegúrese de que no haya colisiones de proceso. Es debido a 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.

Eric Leschinski
fuente
15
Esto arrojará un error si no se encuentra ningún proceso que coincida con el nombre. Es posible que desee utilizar ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9para que xargs no ejecute el comando si no se proporcionan argumentos.
Epigene
2
Solo una ligera modificación, quizás sea mejor citar el nombre del proceso: ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9 sin comillas, solo uno de mis procesos en segundo plano se eliminó en la primera ejecución. Ejecutarlo nuevamente mató al resto.
Ali Haider
-rLa opción no existe en OS X, por lo que parece.
Danijel
52

Si necesita más flexibilidad para seleccionar los procesos, use

for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do 
  kill -9 $KILLPID;
done

Puedes usar grep -e etc.

Eugen Rieck
fuente
44
-1 No necesita un bucle, puede simplemente kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`(observe también la refactorización; vea también mi comentario sobre la respuesta de @ sintetizadorpatel).
tripleee
11
@tripleee No hay problema con su voto negativo, pero se da cuenta de que el OQ era "Quiero matar todos los procesos que obtengo: ps aux | grep my_pattern" , lo cual acepté con su deber.
Eugen Rieck
Kill matará todos los procesos de una vez, no necesita un bucle para eso. Si psdevuelve tres procesos 123, 234 y 345, puede kill 123 234 345igual que puede rmo catmúltiples argumentos de archivo.
tripleee
@tripleee Estoy eliminando elgrep
Eugen Rieck
for KILLPID in ps ax | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; doneeliminará el grep
Justin E
18

puede usar 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 Thanima
fuente
puede usar 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 puede matar el proceso usando kill -9 $ (ps aux | grep -e myProcessName | awk '{print $ 2}')
Nived Thanima
13

También puedes usar killall -r my_pattern. -rInterprete el patrón de nombre de proceso como una expresión regular extendida.

killall -r my_pattern
Alex
fuente
8

Si juzgas pkill -f PATTERNun poco demasiado peligroso, escribí ezkill un script de bash que te pide que elijas qué procesos entre los que coinciden con el PATRÓN que quieres matar.

kraymer
fuente
7

Puede usar el siguiente comando para

kill -9 $(ps aux | grep 'process' | grep -v 'grep' | awk '{print $2}')
Alex Liu
fuente
4

Si no desea tener dolor de cabeza al encontrar la identificación del proceso, use regexp para eliminar el proceso por nombre. Por ejemplo, para matar a Chrome, el siguiente código hará el truco.

killall -r --regexp chrome

ajaz
fuente
1
Solo necesita uno -r o --regexp , que son la opción corta y la opción larga GNU, respectivamente.
BigSmoke
3

Puede usar el siguiente comando para:

ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9

o

ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9

Esto funciona para mi.

Luis Lopes
fuente
1
Bienvenido a StackOverflow. Use sangría de 4 espacios o tabulaciones para sus líneas de código para que estén formateadas como bloques de código. Saludos cordiales
YakovL
2

¿Suena mal?

 pkill `pidof myprocess`

ejemplo:

# kill all java processes
pkill `pidof java`
usuario6482587
fuente
2

Encontré la mejor manera de hacerlo para un servidor que no admite pkill

kill -9 $(ps ax | grep My_pattern| fgrep -v grep | awk '{ print $1 }')

No tienes que hacer un bucle.

Magige Daniel
fuente
1

que es mejor y más seguro de usar pgrep -fcon kill, o simplemente pkill -f, greping pssalida 's puede ir mal.

A diferencia del uso ps | grepcon el que necesita filtrar la línea grep agregando | grep -vo usando trucos de patrones, pgrepsimplemente no se seleccionará por diseño.

Además, si su patrón aparece en ps's UID/ USER, SDATE/ STARTo cualquier otra columna, obtendrá procesos no deseados en la salida y los matará, pgrep+ pkillno sufra esta falla.

También descubrí que killall -r/ -regexp no funcionaba con mi expresión regular.

pkill -f "^python3 path/to/my_script$"

man pkill

Wis
fuente
0

Tomé la respuesta de Eugen Rieck y trabajé con ella. Mi código agrega lo siguiente:

  1. ps ax incluye grep, así que lo excluí con grep -Eiv 'grep'
  2. Se agregaron algunos ifs y ecos para que sea legible para los humanos.

He creado un archivo, lo llamé killserver, aquí va:

#!/bin/bash
PROCESS_TO_KILL=bin/node
PROCESS_LIST=`ps ax | grep -Ei ${PROCESS_TO_KILL} | grep -Eiv 'grep' | awk ' { print $1;}'`
KILLED=
for KILLPID in $PROCESS_LIST; do
  if [ ! -z $KILLPID ];then
    kill -9 $KILLPID
    echo "Killed PID ${KILLPID}"
    KILLED=yes
  fi
done

if [ -z $KILLED ];then
    echo "Didn't kill anything"
fi

Resultados

  myapp git:(master) bash killserver
Killed PID 3358
Killed PID 3382
Killed
  myapp git:(master) bash killserver
Didn't kill anything
Meir Gabay
fuente
0

Esta es la forma:

kill -9 $(pgrep -d' ' -f chrome)
MadMad666
fuente
3
Si bien este código puede responder la pregunta, proporcionar un contexto adicional con respecto a cómo y / o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta.
Igor F.