@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":
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.
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
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.
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
-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
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.
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.
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.
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
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.
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.
my_pattern
simplemente una subcadena del nombre o contiene caracteres especiales de expresiones regulares?Respuestas:
Uso
pkill -f
, que coincide con el patrón para cualquier parte de la línea de comandofuente
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.killall -m my_pattern
.pgrep
primero para verificar lo que vas a matar. Puede usarpgrep -l
para ver nombres de procesos opgrep -a
para ver líneas de comando completas. Utiliza las mismas banderas que pkill. Entonces, en este caso, podrías usarpgrep -fa my_pattern
.Elimine todos los procesos que coincidan con la cadena "myProcessName":
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 -ef
produce 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. Elgrep -v grep
dicho 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 pidkill -9
, terminando con todos.El código anterior es malo, peligroso, feo y hackeo por varias razones.
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 kill
parte con un indicador transmitido que solicite un apagado correcto, y solo si esa solicitud es denegada, el último recurso parakill -9
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 -ef
enumera 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.
fuente
ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9
para que xargs no ejecute el comando si no se proporcionan argumentos.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.-r
La opción no existe en OS X, por lo que parece.Si necesita más flexibilidad para seleccionar los procesos, use
Puedes usar grep -e etc.
fuente
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).ps
devuelve tres procesos 123, 234 y 345, puedekill 123 234 345
igual que puederm
ocat
múltiples argumentos de archivo.grep
for KILLPID in
ps ax | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}'; do kill -9 $KILLPID; done
eliminará el greppuede usar el siguiente comando para enumerar el proceso
si necesita verificar el recuento de ese proceso, ejecute
después de lo cual puedes matar el proceso usando
fuente
También puedes usar
killall -r my_pattern
.-r
Interprete el patrón de nombre de proceso como una expresión regular extendida.fuente
Si juzgas
pkill -f PATTERN
un 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.fuente
Puede usar el siguiente comando para
fuente
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
fuente
-r
o--regexp
, que son la opción corta y la opción larga GNU, respectivamente.Puede usar el siguiente comando para:
o
Esto funciona para mi.
fuente
¿Suena mal?
ejemplo:
fuente
Encontré la mejor manera de hacerlo para un servidor que no admite
pkill
No tienes que hacer un bucle.
fuente
que es mejor y más seguro de usar
pgrep -f
conkill
, o simplementepkill -f
,grep
ingps
salida 's puede ir mal.A diferencia del uso
ps | grep
con el que necesita filtrar la línea grep agregando| grep -v
o usando trucos de patrones,pgrep
simplemente no se seleccionará por diseño.Además, si su patrón aparece en
ps
'sUID
/USER
,SDATE
/START
o cualquier otra columna, obtendrá procesos no deseados en la salida y los matará,pgrep
+pkill
no 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
fuente
Tomé la respuesta de Eugen Rieck y trabajé con ella. Mi código agrega lo siguiente:
ps ax
incluye grep, así que lo excluí congrep -Eiv 'grep'
He creado un archivo, lo llamé
killserver
, aquí va:Resultados
fuente
Esta es la forma:
fuente