Cómo dar argumentos para matar a través de una tubería

85

Necesito buscar un determinado proceso y matar ese proceso. Escribí un comando como este:

ps -e | grep dmn | awk '{print $1}' | kill

Donde está el nombre del proceso dmn. Pero no está funcionando. ¿Cómo puedo encontrar procesos por nombre y killellos?

usuario567879
fuente

Respuestas:

162
kill $(ps -e | grep dmn | awk '{print $1}')
Daniel Persson
fuente
8
Utilice la nueva $()sintaxis: kill $(ps -e | grep dmn | awk '{print $1}').
Stratus3D
7
Por otro lado, tuve que modificar esta respuesta para que funcionara: kill $(ps -efw | grep dmn | grep -v grep | awk '{print $2}')no estoy seguro de por qué y no me importa lo suficiente.
Joshweir
1
@joshweir Es porque de lo contrario killtrató de matar incluso el proceso 'grep' que estaba tratando de buscar el patrón
decir,
¿No sería necesario \ndespués de cada awk, como en awk '{print $1"\n"}'?
Sopalajo de Arrierez
43

En caso de que haya varios procesos que desee eliminar, puede usar esto:

ps -efw | grep dmn | grep -v grep | awk '{print $2}' | xargs kill

Nota: Debe eliminar el proceso grep en sí de la salida, por eso grep -v grepse usa.

jcollado
fuente
17
Puede evitar que grep aparezca en su grep poniendo el primer carácter entre corchetes, como: grep [d] mn
Oldskool
1
@Oldskool Buen truco. Usar metacaracteres para hacer que la expresión regular grep no coincida es una buena idea.
jcollado
@Oldskool, +1, ¡eres un genio!
jcr
Buen truco, aunque hace que sea más complicado convertirlo en un script de shell
Metagrapher
17

Podrías usar

pkill dmn 

si su sistema tiene el comando pkill .

unutbu
fuente
1
+1 para pkill en lugar de killall. Está disponible en múltiples plataformas sin un "significado" diferente ( killall en Solaris es equivalente a killall5 en Linux, por ejemplo, es decir, matar TODOS los procesos)
plundra
4

Solo agrego otros, pero me gusta usar la capacidad de características de expresiones regulares de awk:

kill $(ps | awk '/dmn/{print $1}')
Pedmiston
fuente
4

Si tiene el pidofcomando en su sistema (sé que los shells como ZSH vienen con esto por defecto, a menos que me equivoque), podría hacer algo como.

kill -9 $(pidof dmn)
Nathan F.
fuente
2

Es posible que no lo necesite pipe, si tiene el pidofcomando y conoce el nombre de la imagen, lo hice así:

kill $(pidof synergyc)

$()Entiendo esto ya que convierte esa salida en una variable que kill puede usar, esencialmente como lo haría pipe. Más corto y más fácil de entender que algunas otras opciones, pero también quizás menos flexible y más directo.

NotVeryPythonic
fuente
0
for procid in $(ps -aux | grep "some search" | awk '{print $2}'); do kill -9 $procid; done

hola amigos ... podemos hacerlo usando for loop.

"Algunas búsquedas" es aquí cualquier nombre de proceso que desee buscar, por ejemplo "java", así que digamos que el número de procesos java es 200+, por lo que matar uno por uno será demasiado típico.

para que pueda usar el comando anterior.

Gracias.

Nishant
fuente
0

Úselo pgrepcon la opción -f. kill $(pgrep -f dmn)

Deepak Sharma
fuente
4
Si es así pgrep, ¿por qué no simplemente pkill -f dmn?
muru